我有一个像这样的文本文件(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:
Run Code Online (Sandbox Code Playgroud)
我想要一个perl单行程序,只保留文件中的那些行,其中":"后跟数字范围(这意味着,这里包含"NP_418345.2:"和"NP_418398.2:"的行被删除).为此,我尝试过:
perl -ni -e "print unless /: \d/" -pi.bak input.txt del input.txt.bak
Run Code Online (Sandbox Code Playgroud)
但它显示与输入文件完全相同的输出.我能在这里匹配的确切模式是什么?谢谢
首先,print unless意味着print if not- 与你想要的相反.
更重要的是,它并没有使用这两种意义-n和-p,当你这样做-p会覆盖其他.虽然它们都打开输入文件并在线上设置循环,但-p也会$_为每次迭代打印.因此,你正在重印每一行.见perlrun.
最后,你似乎正在删除.bak文件......?然后不要成功.使用公正-i
共
perl -i -ne 'print if /:\s*\d+\s*-\s*\d+/' input.txt
Run Code Online (Sandbox Code Playgroud)
如果您确实希望使用备份文件-i.bak而不是-i
你可以看到代码相当于带有B :: Deparse的特定选项的单行代码(通过O模块)
试试:perl -MO=Deparse -ne 1和perl -MO=Deparse -pe 1