0

我有如下文件文本:

java-environment-common (3-1)
jdk8-openjdk (8.u172-2)
libart-lgpl (2.3.21-4)
expect (5.45.4-1)
dejagnu (1.6.1-1)
cython2 (0.28.4-1)
python2-pytz (2018.5-1)
python2-sip (4.19.8-1)

我想删除括号中的所有文本(包括括号)。

我使用%s/\(.*\)//g,但它删除了每一行。

终于,我得到了真正的答案:%s/\s\(.*\)//g!但是为什么正则表达式的结果如此不同,第二个只是删除一个空格。

请告诉我原因,谢谢!

4

5 回答 5

2

在非非常神奇的模式下,\(...\)创建一个捕获组,您实际上并不匹配文字(and)\(and \)

你一定在寻找

%s/\s*(.*)//g

运行此命令后,我得到以下输出:

java-environment-common
jdk8-openjdk
libart-lgpl
expect
dejagnu
cython2
python2-pytz
python2-sip

要仅删除行尾的 0+ 空格和以下(...)子字符串,您可以使用

%s/\s*([^()]*)$//g

在哪里

  • \s*- 0+ 个空格
  • (- 文字((在非非常神奇的模式下)
  • [^()]*- 0+ 字符除了()
  • )- 文字)(在非非常神奇的模式下)
  • $- 队伍的尽头。
于 2018-07-18T10:04:29.587 回答
2

通过将转义斜杠\放在括号之前,您不小心创建了捕获组。对于 vim,这意味着由于我们放置在这些括号中的正则表达式,您找到的任何内容都应该被保存,以便我们可以在替换中再次使用这些值。它实际上根本不搜索括号!您实际上正在做的%s/\s\(.*\)//g是找到一个空格,\s后跟任意数量的 any character,保存这些字符以供以后使用,然后将找到的所有内容替换为空(不使用您之前保存的值)。这也恰好删除了您的括号及其内容,但不是出于您认为的原因

如果您想搜索括号,删除它们并删除其中的所有内容,正确的方法是不要转义括号,如下所示:

:%s/\s(.*)$//g 在这里,我告诉 vim 找到一个空格,后跟一个左括号,然后是任意数量的任意字符,然后是右括号,然后是换行符(结束行),然后我告诉它用空替换所有内容(表示由//)

于 2018-07-18T10:09:34.310 回答
1

另一个命令

:%norm f(D

% ...... the whole file
f( ..... jump to the next (
D ...... erases till the end of line

使用t(而不是f(我们也可以删除空格

于 2018-07-18T15:21:22.873 回答
1

您可以使用:

:%s/\s(.*)//g

于 2018-07-19T10:50:29.483 回答
0

您还可以在您的特定情况下使用:normal command(更多信息:http: //vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching),您可以使用以下内容: :normal /(/di

命令解释:在()的范围内寻找一个(then将删除。di

于 2018-07-18T12:09:17.623 回答