sed 删除特定行

sed 删除特定行

删除除NM开头的字符串,用sed应该怎么写

输入文件

NF
NM_001708.2(OPN1SW)
NM_000374.5(UROD)
NM_000235.4(LIPA)
NM_021828.5(HPSE2)
HPSE2, EX8-9DEL
HPSE2, EX3DEL
NM_021828.5(HPSE2)

输出文件

NM_001708.2(OPN1SW)
NM_000374.5(UROD)
NM_000235.4(LIPA)
NM_021828.5(HPSE2)
NM_021828.5(HPSE2)

这个方法不是我想要的,因为 ^ 表示开始,也表示反向 请问如何优化,谢谢

sed -r '/^[^NM]/d' input_file 

答案1

$ sed '/^NM/!d' input_file
NM_001708.2(OPN1SW)
NM_000374.5(UROD)
NM_000235.4(LIPA)
NM_021828.5(HPSE2)
NM_021828.5(HPSE2)

否定!匹配,因此这个 sed 脚本删除了匹配的每一行首先NM。来自man sed(GNU 版本):

在地址(或地址范围)之后、命令之前,! 可以插入 a,它指定仅当地址(或地址范围)不匹配时才执行该命令。

其中/^NM/!d/^NM/是地址(以“NM”开头的行),命令是d(删除)。


顺便说一句,^在正则表达式中仅表示否定(或用你的术语来说反转)当它是括号表达式内的第一个字符时。你的[^NM]意思是“匹配所有不是N或M的字符”,而不是“所有不是N后跟M的字符”。

答案2

如果您对其他工具没问题,可以尝试使用grep

grep -e '^NM' input_file

或与awk

awk '/^NM/{print}' input_file

根据评论的推荐,您可以使用awk

awk '/^NM/' input_file

相关内容