perl one-liner只保留所需的线条

时间:2016-10-26 07:42:16

标签: perl

我有一个像这样的文本文件(input.txt):

NP_414685.4: 15-26, 131-138, 441-465
NP_418580.2: 493-500
NP_418780.2: 36-48, 44-66
NP_418345.2:
NP_418473.3: 1-19, 567-1093
NP_418398.2:

我想要一个perl单行程序,只保留文件中的那些行":"后跟数字范围(这意味着,这里包含" NP_418345.2:"" NP_418398.2:"删除)。为此,我尝试过:

perl  -ni -e "print unless /: \d/" -pi.bak input.txt del input.txt.bak

但它显示与输入文件完全相同的输出。 我能在这里匹配的确切模式是什么? 感谢

3 个答案:

答案 0 :(得分:6)

首先,print unless表示print if not - 与您想要的相反。

更重要的是,使用-n-p都没有意义,当你-p覆盖另一个时。虽然它们都打开输入文件并在线上设置循环,但-p也为每次迭代打印$_。因此,你正在重印每一行。请参阅perlrun

最后,您似乎正在删除.bak文件......?然后不要成功。仅使用-i

perl -i -ne 'print if /:\s*\d+\s*-\s*\d+/' input.txt

如果您确实希望保留备份文件,请使用-i.bak代替-i

您可以通过B::Deparse(通过O模块)看到与单行代码等效的代码(<{3}}模块)

尝试:perl -MO=Deparse -ne 1perl -MO=Deparse -pe 1

答案 1 :(得分:2)

这样:

perl -i.bak -ne 'print if /:\s+\d+-\d/' input.txt

答案 2 :(得分:1)

此:

perl -ne 'print if /:\s*(\d+\s*-\s*\d+\s*,?\s*)+\s*$/' input.txt

打印:

NP_414685.4: 15-26, 131-138, 441-465
NP_418580.2: 493-500
NP_418780.2: 36-48, 44-66
NP_418473.3: 1-19, 567-1093

我不确定您是否要匹配可能是这样的行:

NP_418580.2: 493-500, asdf

或者这个:

NP_418580.2: asdf

如果给出答案,这个答案将不会打印这些行。