Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用vim在单行中查找重复项_Regex_Vim_Duplicates - Fatal编程技术网

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

Regex 使用vim在单行中查找重复项,regex,vim,duplicates,Regex,Vim,Duplicates,假设我有一个包含多行的文件,比如 A.B C B.DAT E.F C F1.DAT 我想识别那些有重复项的行(例如B)。 但仅当副本后面跟着.DAT时 (注意,每个元素A、B、C……可以是任意长度) 因此,在前面的示例中,第一行应该返回匹配项,第二行不应该返回匹配项 我想继续删除重复项(即B.DAT),那么如何确保只匹配每行的第二个匹配项呢?此正则表达式应该满足您的要求(如果我理解您的意思…) 这意味着 \( 2: and "keep" it for later with `\

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

A.B C B.DAT
E.F C F1.DAT
我想识别那些有重复项的行(例如B)。 但仅当副本后面跟着.DAT时 (注意,每个元素A、B、C……可以是任意长度)

因此,在前面的示例中,第一行应该返回匹配项,第二行不应该返回匹配项


我想继续删除重复项(即B.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
使用此正则表达式,您可以使用

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

更新结果表明,副本可以由多个字符组成。在这种情况下,正则表达式变成
\(\S\+\).\zs\1\.DAT
\S\+
现在可以匹配任意数量的非空白字符,正则表达式的其余部分是相同的。

我认为上面的解释会非常有用。它可以完成这项工作,但也许我应该添加“B”可以是任意长度,所以目前它只匹配一个字符+.dat。
%s/\(.\).*\zs\1\.DAT//