这些年来,我已经多次在 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