Как я могу напечатать текст между двумя шаблонами ПОСЛЕ сопоставления с другим шаблоном?

Нет, настроить нельзя.

Вы, вероятно, не используете /usr/local/lib/systemd/systemdдля чего-либо еще, вы, вероятно, могли бы организовать симлинк или привязать монтирование.

Как systemd использует сценарии /etc/init.d? перечисляет четыре разных каталога, которые systemd использует для системных служб.

2
22.12.2019, 15:30
4 ответа

Например, с помощью sed

sed -n 's/^.*MATCH1_TEXT.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

предполагая, что совпадающие тексты встречаются не более одного раза в строке и по порядку.

Если MATCH1_TEXTможет появиться в любом месте строки, то другой способ взглянуть на проблему состоит в том, чтобы игнорировать все строки, в которых его нет, поэтому программа становится

sed -n '/MATCH1_TEXT/!d;s/.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

Если MATCH2_TEXTможет встречаться более одного раза, например. ввод был

 text MATCH1_TEXT stuff MATCH2_TEXT and MATCH2_TEXT until MATCH3_TEXT

, тогда вопрос в том, какой результат требуется, untilили and MATCH2_TEXT until? Аналогичный вопрос возникает с повторяющимися копиями MATCH3 _TEXT. С ними можно справиться с помощью немного более сложных программ sed. Например, чтобы сохранить самую длинную строку

sed -n '/MATCH1_TEXT/!d;/MATCH2_TEXT.*MATCH3_TEXT/!d;s/MATCH2_TEXT/\n/;s/^.*\n\(.*\)MATCH3_TEXT.*$/\1/p'

который сначала отбрасывает все неподходящие строки, а затем заменяет первое вхождение ПОИСКПОЗ2 _ТЕКСТ на новую строку (в строке никогда не будет новой строки )затем выбирает текст между новая строка и ПОИСКПОЗ3 _ТЕКСТ.

Некоторые языки, такие как perlи python, расширили операции, доступные в регулярных выражениях, чтобы разрешить «минимальное совпадение», которое может помочь в этих случаях, но не требуется. sedс его способностью зацикливаться по условию является строго более мощным, чем регулярные выражения.

5
27.01.2020, 21:51
Tested and worked fine

Команда

sed -n '/MATCH1_TEXT/p' filename | perl -pne "s/ /\n/g"| sed -n '/MATCH2_TEXT/,/MATCH3_TEXT/p'| sed -e '1d' -e '$d'


output

until
-2
27.01.2020, 21:51

Всякий раз, когда мы видим слово «экстракт», первой мыслью, которая должна выйти, должно быть, grep может помочь здесь.

Здесь мы сначала выбираем релевантные строки, а затем передаем их другому grep, который затем извлекает текст, найденный между текстами match2 и match3. Это даже извлечет несколько совпадений 2/3 в строке.

$ grep MATCH1_TEXT file |\
  grep -oP '(?<=MATCH2_TEXT).*?(?=MATCH3_TEXT)' 
4
27.01.2020, 21:51

Недостаточно данных примера, чтобы быть уверенным в ваших фактических требованиях, но если предположить, что ваш пример достаточно канонический, так что

  1. MATCH1_TEXT, MATCH2_TEXTи MATCH3_TEXTнаходятся на одной строке
  2. MATCH1_TEXTвсегда предшествуетMATCH2_TEXT
  3. MATCHn_TEXTможет совпадать внутриTHEMATCHn_TEXTS

затем вы можете использовать один вызов perlили GNU grepдля извлечения необходимых данных

grep -oP 'MATCH1_TEXT.*?MATCH2_TEXT\K.*?(?=MATCH3_TEXT)'

С вашей строкой примера данных вывод будетuntil(с одним начальным и конечным пробелом ).

1
27.01.2020, 21:51

Теги

Похожие вопросы