Извлечь строку между двумя другими заданными строками

Я хочу сохранить символьную строку между двумя другими символьными строками. ("аа" и "куб").

Проблема в том, если у меня есть несколько "cc". Я хочу принять во внимание первый "cc", а не последний "cc".

Мой файл monfic.txt содержит только эту строку:

aazzaczzccyyayyaattcttcc

И sed выражение, которое я пытаюсь:

sed 's/.*aa\(.*\)cc.*/\1/' monfic.txt

Возвращает:

zzaczzccyyayyaattctt

Принимая во внимание, что я хочу, чтобы это было выводом:

zzaczz

2 ответа

Ты можешь использовать grep с расширениями Perl, чтобы вывести список всех совпадений, а затем просто выбрать нужное совпадение в конвейере:

grep -Po 'aa.*?cc' <<< "aazzaczzccyyayyaattcttcc" | sed -n 's/^aa//;s/cc$//;1p'

Если вам нужен матч, отличный от первого, просто поменяйте 1p на любую линию или диапазон строк, который вы хотите.
Например 2p или же 2p;5p; или же 1,3p;5; и т.п.

Это может работать для вас (GNU sed):

sed -r 's/^[^a]*(a[^a]+)*aa([^c]*(c[^c]+)*)cc.*/\2/' file

Это соответствует на первом aa с последующим первым cc и извлекает строку между ними.

Другие вопросы по тегам