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

7nu*_*ull 6 vim

多年来,我在谷歌上搜索了几次,但没有找到一个好的解决方案,所以我放弃并询问。

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

所以说我有这个清单

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
Run Code Online (Sandbox Code Playgroud)

我想删除所有内容,但 bwrb.*471,[0-9] 所以我只剩下

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

rom*_*inl 15

:%s/\v(.*)(bwrb.*471,\d)(.*)/\2
Run Code Online (Sandbox Code Playgroud)

用你的样品做你想做的事。如果您的现实世界需求更复杂,则可能需要对其进行更改。

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

一步步:

  • %s/

    替换是在整个文件上完成的。

  • \v

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

  • (.*)

    第一组包含任意数量的任意字符。锚定到行的开始暗示,使其符合什么是之前你想要什么。它将\(.*\)没有“非常神奇”的标志。

  • (bwrb.*471,\d)

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

  • (.*)

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

  • /\2

    替换零件仅包含在第二组中。