Regex 如何在perl中从不受限制的字符串中删除重复的子字符串?
我有一个奇怪的情况,我想删除一个非常长的无限制字符串中的子字符串的第一个匹配项。我在这里发现了一些类似的话题,但没有一个和我的很像 为了简单起见,这里有一些字符串前后的sudo。 我有一个不受限制的文件,其中c可以是数千个随机字符,但bbb是唯一的字符串:Regex 如何在perl中从不受限制的字符串中删除重复的子字符串?,regex,string,perl,Regex,String,Perl,我有一个奇怪的情况,我想删除一个非常长的无限制字符串中的子字符串的第一个匹配项。我在这里发现了一些类似的话题,但没有一个和我的很像 为了简单起见,这里有一些字符串前后的sudo。 我有一个不受限制的文件,其中c可以是数千个随机字符,但bbb是唯一的字符串: aaabbbbbbccccccbbbccccccbbbccccccaaa 我想删除除第一个bbb以外的所有bbb: aaabbbccccccccccccccccccaaa aaabbbccccccccccccccccccaaa 此外,我
aaabbbbbbccccccbbbccccccbbbccccccaaa
我想删除除第一个bbb以外的所有bbb:
aaabbbccccccccccccccccccaaa
aaabbbccccccccccccccccccaaa
此外,我希望能够将其作为一个perl脚本使用,我可以通过管道:
cat file.in | something | perl -pe 's/bbb//g' | somethingelse > file.out
但是,与上面的示例不同,我希望保留bbb的第一次出现
这看起来应该很容易,但这让我很困惑。
有什么想法吗?
提前谢谢 以下内容可能会有所帮助:
use strict;
use warnings;
my $string = 'aaabbbbbbccccccbbbccccccbbbccccccaaa';
$string =~ s/(?<=bbb).*?\Kbbb//g;
print $string;
产出:
aaabbbcccccaaa
+1:优雅。一行代码:echo aaabbbccccccccccaaa | perl-pe'$seen=0;sub f{return$seen++==1?shift:}s/bbb/f$1/ge'当我尝试这个方法时,我得到了如下结果:无法识别的转义\K通过。@Raven-零宽度断言\K保留左边的内容,从Perl v5.10开始。如果无法识别,则很可能您的Perl版本早于v5.10。这就是原因。我们仍然在许多服务器上运行SuSE 10,默认情况下,这些服务器只有PerlV5.8.8。这是不幸的,因为您的解决方案看起来比其他解决方案更小、更高效。@Raven-可以使用捕获来代替\K:s/?
my $string = 'aaabbbbbbccccccbbbccccccbbbccccccaaa';
my $seen;
sub first {
$seen++;
return $_[0] if $seen eq 1;
return '';
}
$string =~ s/(bbb)/first($1)/ge;
say $string;