Извлечь строку между двумя другими заданными строками
Я хочу сохранить символьную строку между двумя другими символьными строками. ("аа" и "куб").
Проблема в том, если у меня есть несколько "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
и извлекает строку между ними.