Извлечь текст между двумя маркерами и заменить символ - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу изменить

>lcl|ORF183:9482:8118 unnamed protein product

на

>ORF183:9482-8118

Сохранить все после | и до «пробела», плюс заменить второй : на -

Пока что я делаю это со следующим кодом:

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

, но хочу сделать это в более простом однострочном коде.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вот некоторые улучшения, основанные на коде, который вы пробовалилюбой текст между > и |

sed позволяет указать, какое совпадение вы хотите заменить, s/:/-/2 означает замену 2-го : на -


Если ваша реализация sed позволяет группировать, вы можете сгруппировать все команды (разделенные ;) внутри {} для определенного адреса

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


Пожалуйста, посетите https://stackoverflow.com/tags/sed/info для учебных ресурсов и других вкусностей

0 голосов
/ 26 сентября 2018

Это может работать:

sed -e 's/\(^.*|\)\(.*\):\(.*\):\(.*\)[[:space:]]\(unnamed.*$\)/>\2:\3-\4/' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...