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

Tri*_*ook 0 regex unix perl

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

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

perl -pe "s/^@.*\n\s*\n+//mg" test.txt
Run Code Online (Sandbox Code Playgroud)

希望得到以下输出:

@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
Run Code Online (Sandbox Code Playgroud)

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

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

知道我做错了什么吗?

谢谢

Mil*_*ler 5

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

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

perl -pe "BEGIN { undef $/ } s/^@.*\n\s*\n+//mg" test.txt
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

@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
Run Code Online (Sandbox Code Playgroud)