【问题标题】:regex search and delete everything in brackets () using vim正则表达式使用vim搜索并删除括号()中的所有内容
【发布时间】:2018-07-18 09:40:14
【问题描述】:

我有如下文件文本:

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

请告诉我原因,谢谢!

【问题讨论】:

  • 在非非常神奇的模式下,\(...\) 创建一个捕获组。你一定在找%s/\s*(.*)//g
  • \s?(.*) 这将是标准格式,但我无法帮助您为 VIM 提供它
  • @WiktorStribiżew 是的,你的答案是正确的。我对捕获组感到困惑,因为%s/\%(.*\)//g 也删除了每一行。据我所知capturing group 只需将括号中的文本保存到\1。如果我的文件文本像(我删除了空格):java-environment-common(3-1)。我该怎么办?这个。
  • 您的意思是要删除( 之前的空格吗?还是在行尾的(...) 子字符串之前?您可以使用%s/\s*([^()]*)$//g 删除~0+ 空格,然后在行尾使用(...) 子字符串。
  • @WiktorStribiżew 我明白了,非常感谢。

标签: regex vim pacman-package-manager


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的解释!
【解决方案2】:

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

你一定在寻找

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

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

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

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

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

在哪里

  • \s* - 0+ 个空格
  • ( - 文字 ((在非魔法模式下)
  • [^()]* - 除了 () 之外的 0+ 个字符
  • ) - 文字 )(在非魔法模式下)
  • $ - 行尾。

【讨论】:

    【解决方案3】:

    你可以使用:

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

    【讨论】:

      【解决方案4】:

      另一个命令

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

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

      【讨论】:

        【解决方案5】:

        您也可以使用:normal command(更多信息在这里:http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching) 在您的具体情况下,您可以使用以下内容: :normal /(/di

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

        【讨论】:

          猜你喜欢
          • 2019-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-24
          相关资源
          最近更新 更多