0

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

A.B C B.DAT
E.F C F1.DAT

我想确定那些我有重复的行(例如 B)。但仅当重复项后跟 .DAT 时(请注意,每个元素 A、B、C、... 可以是任意长度)

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

我想继续删除重复项(即 B.DAT),那么如何确保仅匹配每行的第二次出现?

4

1 回答 1

8

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

/\(.\).*\zs\1\.DAT

这转化为

\(         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

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

%s/\(.\).*\zs\1\.DAT//

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

于 2012-08-21T09:00:15.553 回答