从列表中,如何保留所有出现次数仅包含" 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.*
(预先排序后)保留所有重复的行,但它会考虑整行(它的目的是 )。
在这个问题中,我正在寻找一种仅考虑"开头的解决方案。该行是否出现不止一次,如果是,则保持整行。有什么指导吗?
答案 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