我正在尝试使用 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 行实例。
知道我做错了什么吗?
谢谢
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)
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |