Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 如何在perl中从不受限制的字符串中删除重复的子字符串?_Regex_String_Perl - Fatal编程技术网

Regex 如何在perl中从不受限制的字符串中删除重复的子字符串?

Regex 如何在perl中从不受限制的字符串中删除重复的子字符串?,regex,string,perl,Regex,String,Perl,我有一个奇怪的情况,我想删除一个非常长的无限制字符串中的子字符串的第一个匹配项。我在这里发现了一些类似的话题,但没有一个和我的很像 为了简单起见,这里有一些字符串前后的sudo。 我有一个不受限制的文件,其中c可以是数千个随机字符,但bbb是唯一的字符串: aaabbbbbbccccccbbbccccccbbbccccccaaa 我想删除除第一个bbb以外的所有bbb: aaabbbccccccccccccccccccaaa aaabbbccccccccccccccccccaaa 此外,我

我有一个奇怪的情况,我想删除一个非常长的无限制字符串中的子字符串的第一个匹配项。我在这里发现了一些类似的话题,但没有一个和我的很像

为了简单起见,这里有一些字符串前后的sudo。 我有一个不受限制的文件,其中c可以是数千个随机字符,但bbb是唯一的字符串:

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;