В приведенных ниже примерах, как можно вернуть строку между n-м шаблоном1 и m-м шаблоном2, где шаблон1 и шаблон2 могут встречаться в строке более одного раза каждый?
Лучший пример:
zz this is string xx zz another string xx third string zz xx and a tail xx
Как бы вы вернулись между вторым zz и третьим xx?
т.е.
another string xx third string zz
Изменить: Для всех, кто ищет это, «Группы захвата» и «Прямые / обратные ссылки» в регулярных выражениях кажутся терминологией для обозначения того, что требуется для этой задачи .. Здесь полезная информация .
РЕДАКТИРОВАТЬ ВЫШЕ
Извините первых помощников. Ваши ответы были хорошими, мой пример был выбран неудачно.
Не стесняйтесь удалить отсюда, чтобы привести в порядок этот вопрос. Я просто оставляю его для полноты изложения исходных ответов.
Плохой исходный вопрос и пример:
echo '1a 2b 3c 4d 5e 6f 7g 8h 9i 0j'
Бонусные баллы, если вы можете придумать решение как без конечных пробелов. Я знаю, что начальные / конечные пробелы можно удалить, снова подключив к sed, но мне любопытно, есть ли более аккуратное решение. Результат, который я ожидал (исключая одинарные кавычки):
'3c 4d 5e 6f'
или ' 3c 4d 5e 6f '
- Я использую sed / awk, так что, надеюсь, вместо того, чтобы просто сопоставить одиночный символ (пробел) it может быть расширен для соответствия n-му вхождению шаблона 1 и m-му вхождению шаблона 2 в будущем.
Я пробовал несколько вариантов. Я считаю, что это ближайший к исправлению с помощью sed:
echo '1 2 3 4 5 6 7 8 9 0' | sed -n 's/.*[ ]{2}.*[ ]{4}.*/\1/p'
Но он возвращает ошибку:
sed -e expression #1, char 28: invalid reference \1 on `s' command's RHS