Удаление строк между двумя символами с помощью sed

#sed #bioinformatics #fasta

#sed #биоинформатика #fasta

Вопрос:

У меня есть несколько наборов данных в формате txt, которые имеют предсказуемое содержимое. Я пытаюсь удалить первый набор строк. Первая строка начинается с >*chromosome , и я хочу удалить все до >*plasmid . Я могу либо сказать ему, чтобы он удалял все, > пока он не встретит его снова, либо удалял все между первым > и вторым > . Я пытался сделать что-то вроде этого:

 sed -i.bak '/>/,/^>*$/{d}' file.txt
 

Это не сработало исходный код, который я нашел, был:

 sed -i.bak '/>/,/^s*$/{d}' file.txt
 

Комментарии:

1. Добро пожаловать в SO, спасибо, что проявили свои усилия, не могли бы вы опубликовать образцы ввода и ожидаемого результата в своем вопросе для лучшего понимания вопроса, спасибо.

2. Вы знаете первую строку, поэтому используете ее адрес, а не регулярное выражение, т.е. 1. Вы знаете, как удалить до регулярного выражения, т. е. address,/regexp/d Теперь вы хотите сохранить строку, которая идентифицируется регулярным выражением. т.е. /regexp/p . Соедините все это (в правильном порядке)!

Ответ №1:

Используйте этот однострочник Perl:

 perl -0777 -pe 's{^>chromosome.*(?=^>plasmid)}{}sm' in.fasta
 

ПРИМЕР:

 # Create example input file:

cat > in.fasta <<EOF
>foo
TCGA
>chromosome
ACGT
>plasmid
CGTA
EOF

perl -0777 -pe 's{^>chromosome.*(?=^>plasmid)}{}sm' in.fasta > out.fasta
 

Вывод в out.fasta :

 >foo
TCGA
>plasmid
CGTA
 

Однострочник Perl использует эти флаги командной строки:
-e : Указывает Perl искать код в строке, а не в файле.
-p : Перебирайте входные данные по одной строке за раз, присваивая им значение $_ по умолчанию. Добавляйте print $_ после каждой итерации цикла.
-0777 : Глотайте файлы целиком.

Регулярное выражение использует эти модификаторы:

/m : Разрешить многострочные совпадения.
/s : Разрешить . сопоставление новой строки.

^>chromosome.*(?=^>plasmid) : Регулярное выражение, которое соответствует >chromosome starts, начинается с начала строки, за которым следует 0 или более символов и заканчивается прямо на (но не включая) совпадение с >plasmid в начале строки. Выражение (?=PATTERN) является положительным прогнозом нулевой длины.

СМОТРИТЕ ТАКЖЕ:
perldoc perlrun : как запустить интерпретатор Perl: переключатели командной строки
perldoc perlre : Регулярные выражения Perl (регулярные выражения)
perldoc perlre : Регулярные выражения (регулярные выражения) Perl: кванторы; Классы символов и другие специальные экранирования; Утверждения; Группы захвата
perldoc perlrequick : Быстрый запуск регулярных выражений Perl