Рейтинг:0

Как добавить первый шаблон регулярного выражения в конец строки с помощью sed?

флаг ke

У меня есть файл .fasta (текстовый), содержащий данные последовательности ДНК в следующем формате:

>uce-8374_Genus_species
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC

Я пытаюсь добавить все до первый подчеркивание, которому предшествует | чтобы только конец строк имел >. Так, например, первая последовательность будет выглядеть так: uce-8374_Genus_species|uce-8374, за которым следует последовательность ДНК под ним. Есть ли способ сделать это в sed? я пытался хранить ^[^_]+(?=_) в переменную, но это не сработало и просто продолжало добавлять ^[^_]+(?=_) до конца строки вместо самого узора. Любая помощь, а также объяснения (поскольку я новичок в регулярных выражениях) были бы полезны. Если есть лучший способ сделать это, я открыт для других вариантов!

До сих пор я пытался (я покажу только первую последовательность ДНК, но я хочу изменить их все):

sed -E 's/species/species|^[^_]+(?=_)/' sample_file.fasta

Результат: uce-8374_Genus_species|^[^_]+(?=_)

и я также пробовал:

х="^[^_]+(?=_)"
sed -E "s/species/species|$x/" "sample_file.fasta"

Результат: uce-8374_Genus_species|^[^_]+(?=_)

Рейтинг:2
флаг hr

В отличие от Perl, sed не поддерживает синтаксис предпросмотра PCRE. (?=_) но вы можете подделать это следующим образом:

  • соответствовать > привязан к началу строки ^>
  • затем сопоставьте и захватите ноль или более не-_ символы ([^_]*)
  • затем сопоставьте все остальное .*

затем заменить на

  • весь совпадающий узор &
  • за которым следует буквальный | а потом первая захваченная группа \1

Так

$ sed -E 's/^>([^_]*).*/&|\1/' sample_file.fasta 
>uce-8374_Genus_species|uce-8374
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species|uce-239
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species|uce-83
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species|uce-902
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC
Justin avatar
флаг ke
Это сработало! Спасибо! Если не возражаете, можете объяснить, что это делает? в частности, вторая и третья часть синтаксиса `sed` здесь?
флаг hr
@Justin, пожалуйста, смотрите обновленный ответ

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.