Как использовать sed /grep для извлечения текста между двумя словами?

Я пытаюсь вывести строку, содержащую все между двумя словами строки:

ввод:

"Here is a String"

выход:

"is a"

Использование:

sed -n '/Here/,/String/p'

включает конечные точки, но я не хочу их включать.

90 голосов | спросил user1190650 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 04:08:45 +0400 2012, 04:08:45

5 ответов


0
sed -e 's/Here\(.*\)String/\1/'
ответил Brian Campbell 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 04:14:09 +0400 2012, 04:14:09
0

Простой grep также может поддерживать положительный & негативный прогноз оглядываться: Для вашего случая команда будет такой:

 echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'
ответил anishsane 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 10:58:37 +0400 2012, 10:58:37
0

Строки можно удалять только в Bash :

$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$

И если у вас есть GNU grep, включающий PCRE , вы можете использовать нулевую ширину утверждение:

$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a
ответил ghoti 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 04:19:51 +0400 2012, 04:19:51
0

Принятый ответ не удаляет текст, который мог быть до Here или после String. Это будет:

sed -e 's/.*Here\(.*\)String.*/\1/'

Основным отличием является добавление .* непосредственно перед Here и после String.

ответил wheeler 5 Mayam17 2017, 06:23:40
0

Через GNU awk,

$ echo "Here is a string" | awk -v FS="(Here|string)" '{print $2}'
 is a 

grep с параметром -P ( perl-regexp ) поддерживает \K, который помогает отбрасывать ранее найденные символы. В нашем случае ранее найденная строка была Here, поэтому она была удалена из окончательного результата.

$ echo "Here is a string" | grep -oP 'Here\K.*(?=string)'
 is a 
$ echo "Here is a string" | grep -oP 'Here\K(?:(?!string).)*'
 is a 

Если вы хотите, чтобы выходные данные были is a, вы можете попробовать следующее,

$ echo "Here is a string" | grep -oP 'Here\s*\K.*(?=\s+string)'
is a
$ echo "Here is a string" | grep -oP 'Here\s*\K(?:(?!\s+string).)*'
is a
ответил Avinash Raj 19 PM00000070000004231 2014, 19:07:42

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132