perl命令行多行正则表达式替代

时间:2014-04-25 05:51:04

标签: regex perl unix

我正在尝试使用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个行实例。

知道我做错了什么?

感谢

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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