我一直想知道如何在给定参数范围内进行替换。
如果你有这样一行内容:
123,Hello,World,(I am, here), unknown
如果你想将
World
替换为Foobar
,那么这是一个简单的任务::%s / World / Foobar /
现在我想知道如何摆脱()
中的,
。理论上,我只需要找到第一次出现的
(
,然后用空格替换,
直到)
。我一直想知道如何在给定参数范围内进行替换。
如果你有这样一行内容:
123,Hello,World,(I am, here), unknown
World
替换为Foobar
,那么这是一个简单的任务::%s / World / Foobar /
现在我想知道如何摆脱()
中的,
。(
,然后用空格替换,
直到)
。尝试使用前瞻断言和后顾断言:
%s/([^)]*\zs,\ze.*)//
\zs
和\ze
指定了模式的开始和结束位置。%s/\(([^)]*\)\@<=,\(.*)\)\@=//
\( ... \)
分组,使其看起来像是混淆的,以及\@<=
是看后面的运算符,除了是ASCII-art鸭子外,还有 \@=
是预测运算符。
参考文献::help pattern
(更多详细信息请参见::help /\@=
,:help /\ze
等)
您使用GUI并想尝试这些命令吗?将它们复制到剪贴板中,然后在Gvim内运行:@ +
。
%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/
\1
中存储圆括号左侧外部的内容,在\4
中存储右侧外部的内容,在圆括号内分别在左侧(\2
)和右侧(\3
)存储内容。 如果你的文件按列组织,那么你可以轻松地交换元素。您还可以选择要更改的文本(使用visual
或visual-block
模式),然后输入:
以启动替换命令。 vi将自动以:'<,'>
开始该命令,将该命令应用于所选区域。
使用以下方法替换,
:
:'<,'>s/,/ /g
就您的例子而言,这与@ubuntuguy建议的相同。
%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3
这将会精确地替换您想要的内容。
,
,而不是括号 ()
内部的那个。 - mouviciel另一种方法是基于实际上您只想在括号内替换第一个出现的,
这一事实:
:%s#\((.\{-}\),#\1 #
解释:
:%s
用于在整个文件中进行替换(如果只想处理当前行,请勿使用 %
)#
或 :
作为分隔符,使命令更易读(.\{-}
中,我们要求在左括号后找到任何符号(点),其余部分表示该符号的出现次数为0或多次(尽可能少)。将此表达式放在 \(...\)
中,以便在将来能够引用此组作为 \1
。