[英]How to find specific lines in a file and then replace a word from those lines keeping everything else intact using vi/vim editor
[英]Replace while keeping certain “words” in vi/vim
例如,如果我有$asd['word_123']
並且我想用$this->line('word_123')
替換它,保留'word_123'。 我怎么能這樣做?
通過使用這個:
%s/asd\[\'.*\'\]/this->line('.*')/g
我無法保持兩者之間的措辭。 請賜教。
使用正則表達式,您可以執行以下操作:%s/\\$asd\\['\\([^']*\\)'\\]/$this->line('\\1')/g
%s
- 替換整個文件
\\$asd\\['
- match“$ asd ['”。 注意$
和[
需要轉義,因為它們在正則表達式中具有特殊含義。
\\([^']*\\)
- \\( \\)
可用於選擇所謂的“原子”,以便您可以在替換中使用它。 [^']
表示不是 '
任何東西, *
表示匹配0或更多。
'\\]
_ '\\]
- 完成我們的比賽。
$this->line('\\1')
- 替換為我們想要的東西, \\1
替換之前匹配的原子。
g
- 對每行的多個匹配執行此操作。
您也可以使用宏來代替正則表達式。 例如,
qq/\$asd<Enter>ct'$this->line(<Esc>f]r)q
然后根據需要多次使用@q
。 你可以在使用@q
一次后使用@@
,如果你想使用80次,你可以使用80@q
。
在某些情況下,使用:norm
可能是最佳選擇。 例如,如果您有一小段代碼,並且您匹配一個唯一的字符或位置。 如果您知道“$”只出現在特定代碼塊的“$ asd”中,您可以直觀地選擇它
:norm $T$ct'this->line(<C-v><Esc>f]r)<Enter>
關於使用:norm更有效的討論,請閱讀:help :norm
和reddit post 。
嘗試使用
:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.