regex使用vim搜索并删除方括号()中的所有内容

时间:2018-07-18 09:40:15

标签: regex vim pacman-package-manager

我的文件文本如下:

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!但是为什么正则表达式的结果如此不同,所以第二个只是删除一个空格。

请告诉我原因,谢谢!

5 个答案:

答案 0 :(得分:2)

在非非常魔术模式下,\(...\)创建一个捕获组,您实际上并未将文字()与{{1} }和\(

您必须在找

\)

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

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

要仅删除0+空格和该行末尾的以下java-environment-common jdk8-openjdk libart-lgpl expect dejagnu cython2 python2-pytz python2-sip 子字符串,请使用

(...)

哪里

  • %s/\s*([^()]*)$//g -超过0个空格
  • \s*-文字((在非常魔术模式下)
  • (-除[^()]*(以外的0多个字符
  • )-文字)(在非常魔术模式下)
  • )-行尾。

答案 1 :(得分:2)

您不小心通过将转义斜杠\放在方括号之前来创建捕获组。对于vim来说,这意味着应该保存所有放在这些括号中的正则表达式,以便我们在替换时再次使用这些值。实际上,它根本不是在寻找括号!您在%s/\s\(.*\)//g中的实际操作是找到一个\s的空格,后跟任意数量的任何字符,保存这些字符供以后使用,然后将发现的所有内容全部替换为空(不使用您之前保存的值)。碰巧也会删除您的方括号及其内容,但并非出于您认为如此的原因

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

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

答案 2 :(得分:1)

另一个命令

:%norm f(D

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

使用t(代替f(,我们也可以删除空格

答案 3 :(得分:1)

您可以使用:

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

答案 4 :(得分:0)

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

命令说明:寻找(,然后di将在()范围内删除。