Как извлечь текст между двумя словами в Unix? - PullRequest
14 голосов
/ 25 мая 2011

Iяс помощьюосновнойСЕПГвыражение: -

sed -n "am/,/sed/p" 

, чтобы получить текст между «am» и «sed», который будет выводить «am \ n используя \ n basic \ n sed».Но моя настоящая проблема в том, что строка будет выглядеть так: -

Iяс помощьюосновнойGrepвыражение.

Я применил вышеупомянутый sed в этом предложении, после чего он дал "am \ n using \ n basic \ n grep \ n expression", которое он не должен давать.Как отменить вывод, если не будет совпадений?

Есть предложения?

Ответы [ 3 ]

13 голосов
/ 25 мая 2011

Команда в вопросе (sed -n "/am/,/sed/p", обратите внимание на добавленную косую черту) означает:

  • Найти строку , содержащую строку am
  • и печатать (p), пока не появится строка, содержащая sed

Поэтому она печатает:

I am using basic grep expression

, поскольку она содержит am.Если вы добавите еще несколько строк, они также будут напечатаны, пока не появится строка, содержащая sed.

Например:

echo -e 'I am using basic grep expression.\nOne more line\nOne with sed\nOne without' | sed -n "/am/,/sed/p"

приведет к:

I am using basic grep expression.
One more line
One with sed

Я думаю, что вы хотите сделать что-то вроде этого:

sed -n "s/.*\(am.*sed\).*/\1/p"

Пример:

echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"

echo 'I am using basic sed expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
sed -n "s/.*\(am.*sed\).*/\1/p"
3 голосов
/ 25 мая 2011

Вы должны использовать немного другую команду sed, например:

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file

Для печати ТОЛЬКО строк, содержащих текст am и sed, охватывающих несколько строк.

1 голос
/ 17 сентября 2013

При использовании SED это может работать, но это довольно сильный синтаксис ... если вам нужно обрезать часть многострочного (\ n) текста , вы можете попробовать более простой способ, используя grep :

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

Например, я считаю, что это самый простой способ получить описание списка изменений (без остатка информации CL):

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

Обратите внимание, вы можете поиграть с <= и> =, чтобы включить или не включить начальные / конечные фразы в вывод.

...