regexp替换一行的几个部分

时间:2017-05-23 12:08:31

标签: regex

我有一个文件,每行写的都是这样的:

m.187 g.187  ORF g.187 m.187 type:internal len:115 (+) Ph1000_1/1_1.000_345:1-348(+) m.189 g.189  ORF g.189 m.189 type:internal len:125 (+) Ph1007_1/1_1.000_376:1-378(+) m.104 g.104  ORF g.104 m.104 type:internal len:354 (+) Pu1004_1/1_1.000_1062:1-1065(+) m.147 g.147  ORF g.147 m.147 type:internal len:150 (+) Te1003_1/1_1.000_451:1-453(+)

它表示基因ID列表,但我想简化这些行中的每一行:例如,如果我采用第一个ID,

m.187 g.187  ORF g.187 m.187 type:internal len:115 (+) Ph1000_1/1_1.000_345:1-348(+)
  • 用' m.187 g.187 ORF g.187 m.187 type:internal len:115 (+)'

  • 替换部件>
  • 替换零件:1-348(+)

为了保持这一点:

>Ph1000_1/1_1.000_345

每一行都会变成:

>Ph1000_1/1_1.000_345 >Ph1007_1/1_1.000_376 >Pu1004_1/1_1.000_1062 >Te1003_1/1_1.000_451

这很复杂;我写的正则表达式,现在,删除我想要的更多东西,只保留最后一个ID,正确写入:

sed -e 's/m.*[ ]([+])[ ]/>/g' -e 's/[:].*$//' $1

给出

>Ph1000_1/1_1.000_345

所以我觉得我已经接近找到了答案,但我有点被困在这里......有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

sed 方法:

sed -E 's/m\.[0-9]{3}[^()]+\(\+\)\s*/>/g; s/:\S+//g' file

输出:

>Ph1000_1/1_1.000_345 >Ph1007_1/1_1.000_376 >Pu1004_1/1_1.000_1062 >Te1003_1/1_1.000_451
  • -E - 启用扩展正则表达式

  • s/m\.[0-9]{3}[^()]+\(\+\)\s*/>/g - 替换所有以m.<3 digits>开头并以(+) >开头的

答案 1 :(得分:0)

试试这个:

sed -e 's/(m.*?\(\+\))/>/g; s/:[\d\W]+//g' file