删除除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