假设我有一个包含多行的文件,例如
A.B C B.DAT
E.F C F1.DAT
我想确定那些我有重复的行(例如 B)。但仅当重复项后跟 .DAT 时(请注意,每个元素 A、B、C、... 可以是任意长度)
所以在前面提到的例子中,第一行应该返回一个匹配,第二行不应该。
我想继续删除重复项(即 B.DAT),那么如何确保仅匹配每行的第二次出现?
假设我有一个包含多行的文件,例如
A.B C B.DAT
E.F C F1.DAT
我想确定那些我有重复的行(例如 B)。但仅当重复项后跟 .DAT 时(请注意,每个元素 A、B、C、... 可以是任意长度)
所以在前面提到的例子中,第一行应该返回一个匹配,第二行不应该。
我想继续删除重复项(即 B.DAT),那么如何确保仅匹配每行的第二次出现?
这个正则表达式应该做你想做的(如果我理解你的话......)
/\(.\).*\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= 的非空白字符,正则表达式的其余部分是相同的。