使用 sed 反向引用时出现问题

使用 sed 反向引用时出现问题

我正在尝试删除一些垃圾并用关键数字替换单词,从以下字符串开始:

>ref|NC_035781.1|  
>ref|NC_035782.1|   
>ref|NC_035783.1|   
>ref|NC_035784.1|   

并想以以下方式结束:

>NC_035781.1  
>NC_035782.1  
>NC_035783.1  
>NC_035784.1  

我试过

sed 's/\>ref\|NC_03578\([0-9]\)\.1\|/>NC_03578\1\.1/g' chr.test | grep '>NC_'

对其进行测试并得到比预期更多的结果,如下所示:

>NC_03578.1>>NC_03578.1r>NC_03578.1e>NC_03578.1f>NC_03578.1|>NC_035780.1|>NC_03578.1 >NC_03578.1C>NC_03578.1r>NC_03578.1a>NC_03578.1s>NC_03578.1s>NC_03578.1o>NC_03578.1s>NC_03578.1t>NC_03578.1r>NC_03578.1e>NC_03578.1a>NC_03578.1   
...  

我究竟做错了什么?

答案1

主要问题是你已经逃脱>并且|我怀疑你正在使用GNU sed.在这种情况下,\>充当字边界结尾并将\|充当交替运算符。

$ sed 's/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1

修改后的命令如上所示。另外,行尾似乎有一些空格,所以我添加了.*它们以删除它们。用于将操作sed -n '/NC_/ s/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/p'包含grepsed其自身中


您还可以使用awk

$ awk -F'|' '/NC_/{print ">" $2}' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
  • -F'|'定义|为字段分隔符。|是一个正则表达式运算符,但是当FS(由 设定的字段分隔符特殊 awk 变量-F)是单个字符时,它不被视为正则表达式。-F'[|]'或者-F'\\|'也可以工作,但效率会较低。
  • /NC_/如果输入行包含NC_
    • print ">" $2打印>字符和第二个字段

相关内容