[英]how to non-capturing search and replace in vim
我正在嘗試學習如何使用vim的正則表達式,我正在嘗試進行搜索和替換。 我有這樣的事情:
aaaaaaa&sometext&...
aaaaaaaanothertext
( a
s實際上是行開頭的空格,我不知道如何在這里打印)
我想用& &
替換&
的第一次出現,並保持其他所有的原樣。 我正在使用\\%(...\\)
作為非捕獲模式,如此處所示 ,但仍然捕獲了a
模式。 我正在使用:%s/\\%(^a*\\)&/& &/gc
,我得到:
aaaaaaaa& aaaaaaaa&sometext&...
aaaaaaaaanothertext
我不明白為什么。 我也嘗試過用組替換,如:%s/\\%(^a*\\)\\(&\\)/\\1 \\1/gc
,但后來我得到:
& &sometext&...
aaaaaaaanothertext
因此,似乎該組實際上被忽略了組處理(因為第一組在搜索模式上是&
),但仍然在搜索模式上捕獲。
所以,長話短說,取代命令我必須使用來自:
aaaaaaa&sometext&...
至:
aaaaaaa& &sometext&...
?
我想替換的第一次出現
&
與& &
,並保留一切按原樣
使用替換命令:
:s/&/& &/
另一個提示:Vim默認處理(
作為文字字符,而不是組的開頭)。
如果您希望正則表達式更像傳統(Perl)正則表達式,請使用very magic
模式。
指定very magic
模式的簡單方法是使用\\v
啟動正則表達式:
" this is a no-op
:s/\v(this is grouped)/\1/
編輯:這個答案有效,但請參閱下面的@ heijp06非常相關的評論(我不知道&
字符有特殊含義)。
評論貼在這里:
實際上這個答案是正確的,這實際上有點不重要。 替換的替換部分中的&替換意味着在這種情況下與模式匹配的那樣的結果是正確的。
“非捕獲”並不意味着您認為它意味着什么。 \\(...\\)
和\\%(...\\)
之間的唯一區別在於子表達式是否保存到\\1
, \\2
......它仍將包含匹配中匹配的內容。
你想要\\@<=
( :help \\@<=
):
:s/\(^a*\)\@<=&/\& \&/g
通常在搜索和替換中,替換完全替換搜索就足夠了。 在這種情況下,您的搜索將包含您不想替換的內容。
Vim有一些有用的模式來定義匹配的開始和結束: \\zs
和\\ze
。 您可以將\\zs
放在搜索的任何位置,vim只會在開始后匹配。 您可以使用兩者來表示,找到此特定行並僅替換其中的一部分。
而解決方案:
:%s:^[^&]*\\zs&:& &:c
%s
:查看文件中的每一行 ^[^&]*
:從行的開頭,應該有零個或多個不 &
\\zs&
:要替換的比賽是一個&
& &
:用兩個替換匹配&
c
:以交互方式執行每個替換,以防我在正則表達式中吮吸
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.