使用vim在单行中查找重复项

Dr.*_*lch 0 regex vim duplicates

假设我有一个包含多行的文件

A.B C B.DAT
E.F C F1.DAT
Run Code Online (Sandbox Code Playgroud)

我想识别那些我有重复的行(例如B).但只有当副本后跟.DAT时(注意每个元素A,B,C,......可以是任意长度)

所以在前面提到的例子中,第一行应该返回匹配而第二行不应该返回匹配.

我想继续删除副本(这将是B.DAT),那么我如何确保仅匹配每行的第二次出现?

Ren*_*ger 8

这个正则表达式应该做你想要的(如果我理解你......)

/\(.\).*\zs\1\.DAT
Run Code Online (Sandbox Code Playgroud)

这转化为

\(         2: and "keep" it for later with `\1`
 .      1: get any character
\)         2:
.*            3: Match any number of characters ...
\zs              4: (and set the start of the matched region)
\1                  5: ... followed by the kept character (step 2)
\.DAT                  6: followed by .DAT
Run Code Online (Sandbox Code Playgroud)

使用此正则表达式,您可以删除B.DATa

%s/\(.\).*\zs\1\.DAT//
Run Code Online (Sandbox Code Playgroud)

更新事实证明,副本可以包含多个字符.在那种情况下,正则表达式变为\(\S\+\).*\zs\1\.DAT.在\S\+现在匹配的非空白字符任何数量> 1 =,正则表达式的其余部分是相同的.