提取两个标记之间的文本并替换字符

时间:2018-09-26 04:28:02

标签: regex unix sed

我想改变

>lcl|ORF183:9482:8118 unnamed protein product

进入

>ORF183:9482-8118

保留|之后和“空白”之前的所有内容,并将第二个:替换为-

到目前为止,我正在使用以下代码进行操作:

sed -e '/^>/s/ .*//' -e '/^>/s/|/ /' -e '/^>/s/lcl //' -e '/^>/s/\(.*\):/\1-/'

但希望用一个简单的单行代码来实现。

2 个答案:

答案 0 :(得分:0)

这可能有效:

sed -e 's/\(^.*|\)\(.*\):\(.*\):\(.*\)[[:space:]]\(unnamed.*$\)/>\2:\3-\4/' 

答案 1 :(得分:0)

根据您尝试的代码,有一些改进

$ sed -e '/^>/s/ .*//' -e '/^>/s/lcl|//' -e '/^>/s/:/-/2' ip.txt
>ORF183:9482-8118
  • -e '/^>/s/|/ /' -e '/^>/s/lcl //'可以简化为-e '/^>/s/lcl|//'
    • 如果要匹配s/>[^|]*|/>/>之间的任何文本,请使用|
  • sed可以指定要替换的匹配项,s/:/-/2表示将第二个:替换为-


如果您的sed实现允许分组,则可以在;内为特定地址将所有命令(用{}分隔)分组

$ sed '/^>/{s/ .*//; s/lcl|//; s/:/-/2}' ip.txt
>ORF183:9482-8118


请访问https://stackoverflow.com/tags/sed/info以获取学习资源和其他好处