Vim 替换

6

我一直想知道如何在给定参数范围内进行替换。

如果你有这样一行内容:

123,Hello,World,(I am, here), unknown

如果你想将World替换为Foobar,那么这是一个简单的任务::%s / World / Foobar / 现在我想知道如何摆脱()中的
理论上,我只需要找到第一次出现的,然后用空格替换直到

2
请阅读有关在您的问题和答案中格式化代码块的常见问题解答。 - Benoit
5个回答

4
尝试使用前瞻断言和后顾断言:

尝试使用前瞻断言和后顾断言:

%s/([^)]*\zs,\ze.*)//
\zs\ze指定了模式的开始和结束位置。
或者
%s/\(([^)]*\)\@<=,\(.*)\)\@=//

第一个更易读,第二个使用了带括号的\( ... \)分组,使其看起来像是混淆的,以及\@<=是看后面的运算符,除了是ASCII-art鸭子外,还有 \@=是预测运算符。

参考文献::help pattern(更多详细信息请参见::help /\@=:help /\ze等)

您使用GUI并想尝试这些命令吗?将它们复制到剪贴板中,然后在Gvim内运行:@ +


3
稍微修改一下@Tom的答案,可以给你一个相当不错和“略微”更易读的结果:
%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/

这样做,你将拥有: 在\1中存储圆括号左侧外部的内容,在\4中存储右侧外部的内容,在圆括号内分别在左侧(\2)和右侧(\3)存储内容。 如果你的文件按列组织,那么你可以轻松地交换元素。

(顺便说一句,Benoit的答案更加优雅) - Simon C.
1
我本来在找别的东西,但我不知道你甚至可以这样做!在这里,虽然不清楚如何实现,但只是知道它是可行的就已经很有帮助了;如果我将来需要它,我会进一步深入研究的! - Richard T

1

您还可以选择要更改的文本(使用visualvisual-block模式),然后输入:以启动替换命令。 vi将自动以:'<,'>开始该命令,将该命令应用于所选区域。

使用以下方法替换,

:'<,'>s/,/ /g

0

就您的例子而言,这与@ubuntuguy建议的相同。

%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3

这将会精确地替换您想要的内容。


不幸的是,这将删除最后一个 ,,而不是括号 () 内部的那个。 - mouviciel

0

另一种方法是基于实际上您只想在括号内替换第一个出现的,这一事实:

:%s#\((.\{-}\),#\1 #

解释:

  • :%s 用于在整个文件中进行替换(如果只想处理当前行,请勿使用 %
  • 我们可以使用 #: 作为分隔符,使命令更易读
  • (.\{-} 中,我们要求在左括号后找到任何符号(点),其余部分表示该符号的出现次数为0或多次(尽可能少)。将此表达式放在 \(...\) 中,以便在将来能够引用此组作为 \1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接