【问题标题】:perl command line multiline regex substituteperl 命令行多行正则表达式替换
【发布时间】:2014-04-25 05:51:04
【问题描述】:

我正在尝试使用 perl 命令行替换多行块。 正文如下:

@LNCaP.2622 GAPC:1:1:4519:1350 length=76
TTTCCATTGCAGGTTTTAAAGTGGAGATTCTGAAGGGGAAAATAGGCACTGTCAGAACAAAGCTACCTGGAAACAG
+LNCaP.2622 GAPC:1:1:4519:1350 length=76
DD@:BBBBDDD@D:B::=:6:(6//;589444004':839>>2;;:':>>:7B:><B<B#################
@LNCaP.2623 GAPC:1:1:4767:1343 length=76

+LNCaP.2623 GAPC:1:1:4767:1343 length=76

@LNCaP.2624 GAPC:1:1:4794:1349 length=76

我尝试运行以下正则表达式:

perl -pe "s/^@.*\n\s*\n+//mg" test.txt

希望得到以下输出:

@LNCaP.2622 GAPC:1:1:4519:1350 length=76
TTTCCATTGCAGGTTTTAAAGTGGAGATTCTGAAGGGGAAAATAGGCACTGTCAGAACAAAGCTACCTGGAAACAG
+LNCaP.2622 GAPC:1:1:4519:1350 length=76
DD@:BBBBDDD@D:B::=:6:(6//;589444004':839>>2;;:':>>:7B:><B<B#################
@LNCaP.2624 GAPC:1:1:4794:1349 length=76

正则表达式 ^@.*\n\s*\n\+.*\n\s*\n 使用上面的文本识别我想在 regex101.com 上删除的 4 行,但是,当我从我的 shell 运行命令时,输出不变:(

我不能使用行号,因为这是从一个更大的文件中提取的,这意味着它必须应用于与该模式匹配的所有 4 行实例。

知道我做错了什么吗?

谢谢

【问题讨论】:

    标签: regex perl unix


    【解决方案1】:

    perl -pe 逐行处理。因此,使用跨行的正则表达式在默认情况下永远不会匹配。

    不过,您可以更改 input record separator $/,以 slurp 整个文件并将正则表达式应用于它:

    perl -pe "BEGIN { undef $/ } s/^@.*\n\s*\n+//mg" test.txt
    

    您在上面建议的正则表达式并没有提供您想要的输出。为此,您需要以下表达式:

    perl -pe "BEGIN {undef $/} s/^@.*\n\s*\n(?:(?!\@).*\n)*//mg" text.txt
    

    输出:

    @LNCaP.2622 GAPC:1:1:4519:1350 length=76
    TTTCCATTGCAGGTTTTAAAGTGGAGATTCTGAAGGGGAAAATAGGCACTGTCAGAACAAAGCTACCTGGAAACAG
    +LNCaP.2622 GAPC:1:1:4519:1350 length=76
    DD@:BBBBDDD@D:B::=:6:(6//;589444004':839>>2;;:':>>:7B:><B<B#################
    @LNCaP.2624 GAPC:1:1:4794:1349 length=76
    

    【讨论】:

    • 还有perl -MData::Dumper -0777 -E'say Dumper $/'
    【解决方案2】:

    Miller 在他的回答中是正确的。您必须将文件的全部内容读入一个变量并对其应用正则表达式。尝试以下代码,我在 slurp 模式下阅读内容并使用否定字符类 [^\n]* 匹配每一行,使用 \n{2,} 匹配空白行:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my $text = do { undef $/; <DATA> };
    $text =~ s/^@(?:[^\n]*\n{2,}){2}//mg;
    print $text;
    
    
    __DATA__
    @LNCaP.2622 GAPC:1:1:4519:1350 length=76
    TTTCCATTGCAGGTTTTAAAGTGGAGATTCTGAAGGGGAAAATAGGCACTGTCAGAACAAAGCTACCTGGAAACAG
    +LNCaP.2622 GAPC:1:1:4519:1350 length=76
    DD@:BBBBDDD@D:B::=:6:(6//;589444004':839>>2;;:':>>:7B:><B<B#################
    @LNCaP.2623 GAPC:1:1:4767:1343 length=76
    
    +LNCaP.2623 GAPC:1:1:4767:1343 length=76
    
    @LNCaP.2624 GAPC:1:1:4794:1349 length=76
    

    像这样运行它:

    perl script.pl
    

    产生:

    @LNCaP.2622 GAPC:1:1:4519:1350 length=76
    TTTCCATTGCAGGTTTTAAAGTGGAGATTCTGAAGGGGAAAATAGGCACTGTCAGAACAAAGCTACCTGGAAACAG
    +LNCaP.2622 GAPC:1:1:4519:1350 length=76
    DD@:BBBBDDD@D:B::=:6:(6//;589444004':839>>2;;:':>>:7B:><B<B#################
    @LNCaP.2624 GAPC:1:1:4794:1349 length=76
    

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多