在 Vim 中如何删除所有不匹配模式的单词和字符

在 Vim 中如何删除所有不匹配模式的单词和字符

这些年来,我已经多次在 Google 上搜索过这个问题,并没有找到一个好的解决方案,所以我放弃并询问。

我希望能够删除所有不符合模式的单词和标点符号。

假设我有这个列表

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1

我想删除除 bwrb.*471,[0-9] 之外的所有内容,所以我留下了

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1

是否有一个简单的 VIM 命令可以完成?

谢谢。

答案1

:%s/\v(.*)(bwrb.*471,\d)(.*)/\2

对样本进行您想要的操作。如果您的实际需求更复杂,则可能需要进行修改。

基本上,模式匹配整行,但我们使用分组来区分我们想要的和不想要的。我们得到三个组,“我们想要的之前”、“我们想要的”、“我们想要的之后”,我们用第二个组替换整行,记为\1

一步步:

  • %s/

    替换是针对整个文件进行的。

  • \v

    “非常神奇”标志对于限制反斜杠的数量并提高可读性很有用。

  • (.*)

    第一组包含任意数量的任意字符。锚定到行首是隐含的,因此它匹配任何你想要的。它将\(.*\)没有“非常神奇”标志。

  • (bwrb.*471,\d)

    这是第二组:您的模式。我唯一改变的是[0-9]我用等效但更短的替换了\d

  • (.*)

    第三组包含直到行尾的任意数量的任意字符。

  • /\2

    替换部件仅包含第二组。

答案2

我会使用这个命令:

%s/.*\(BWRB.*471,[0-9]\).*/\1

%:将命令应用到文件的所有行。

s/pattern/replacement/: 替换命令与sed:一起使用

  • .*匹配任意字符,直到找到匹配的子字符串\(BWRB.*471,[0-9]\)。子字符串后面的任意字符都由 匹配.*。括号指示vi保存子字符串。

  • 替换\1会打印先前保存的子字符串,实际上会从行中删除所有不需要的字符。

例如,这个文件(对您的示例进行了稍微修改):

R61,1,BWRBW0471,2
R14,1,BWRBW0471,5
R162,1,BWRBN0471,0
R61 ,1,BWRBN0471,4
R61 ,1,BWRBN0471,1
R61 ,1,BWRBN0766471,1

转换为:

BWRBW0471,2
BWRBW0471,5
BWRBN0471,0
BWRBN0471,4
BWRBN0471,1
BWRBN0766471,1

答案3

我不太确定你的字符串前面有多少可变性,但听起来你只是想要一个简单的“在每一行上替换到 BWRB”。

:%s/.*\zeBWRB//g

相关内容