保持列表的所有行具有相同的开头(Notepad ++)

时间:2017-10-15 00:35:22

标签: list sorting duplicates notepad++

从列表中,如何保留所有出现次数仅包含" first part或begin" (从行的开头到^字符定义)是否出现在其他行中? (列表中的行模式:行首 ^ rest_of_line_012345)

^之后的字符类型,长度等无关紧要(但需要保留)。每行只有一(1)个^个字符。 "开始"确定身份的字符串必须存在于其他行中的相同(类似)位置(即,从行的开头到^,并且必须完全匹配)。 (行包含使正则表达式出现问题的字符,例如\/()*.,因此需要对它们进行即时转义。)

例如:原始列表:

abc^123
0xyz^xxx
aaa-123^123
aaa-12^0xyz
0xyz^098
00xyz^098
0xyz^x111xx

保持所有出现的行具有相同的第一部分:

0xyz^xxx
0xyz^098
0xyz^x111xx

这个优雅的脚本由@Lars Fischer ((.*)\R(\2\R?)+)*\K.*(预先排序后)保留所有重复的行,但它会考虑整行(它的目的是 )。

在这个问题中,我正在寻找一种仅考虑"开头的解决方案。该行是否出现不止一次,如果是,则保持整行。有什么指导吗?

2 个答案:

答案 0 :(得分:0)

注意:在此解决方案中,使用字符#和%是基于这些字符在文件中不显示任何地方的假设。如果情况并非如此,只需使用您知道不会在文件中的任何位置显示的不同模式,例如#####和%%%%%。

首先使用Notepad ++按字典顺序排序文件,方法是转到编辑 - >线路操作 - >按字典顺序排序行

进行正则表达式查找和替换(取消勾选"。匹配换行符#34;)

找到:

^(.*?)\^[^\r\n]+[\r\n]+(\1\^.*?[\r\n]+)*\1\^.*?$

替换为:

#$&%

现在进行另一个正则表达式查找和替换(选中"的框,匹配换行符#34;)

找到:

%.*?#

替换为:

\r\n

最后,做一个最后的正则表达式查找和替换(选中"的框,匹配换行符#34;)

找到:

^.*?#|%.*

替换为零。

答案 1 :(得分:0)

你在评论中说perl脚本对你来说没问题。

#!/usr/bin/perl
use Modern::Perl;

my %values;
my $file = 'path/to/file';
open my $fh, '<', $file or die "unable to open '$file': $!";
while(<$fh>) {
    chomp;
    # get the prefix value
    my ($prefix) = split('\^', $_);
    # push in array the whole line in hash with the prefix as key
    push @{$values{$prefix}}, $_;
}
foreach (keys %values) {
    # skip the prefix tat have only one line
    next if scalar @{$values{$_}} == 1;
    local $" = "\n";
    say "@{$values{$_}}";
}

输出

0xyz^xxx
0xyz^098
0xyz^x111xx