我有一个像这样的文本文件(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
但它显示与输入文件完全相同的输出。 我能在这里匹配的确切模式是什么? 感谢
答案 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 1
和perl -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
如果给出答案,这个答案将不会打印这些行。