Bash sed/grep извлекает текст между двумя словами

Моя проблема такая же, как и здесь, за исключением того, что я хочу только первое вхождение, игнорировать все остальное:

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

В его примере, если это будет:

input: "Here is a String Here is a String"

Но я только забочусь о первом "есть",

echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)'

output: "является строкой Вот"

Возможно ли это с помощью grep? Я мог бы использовать sed также для работы.

благодаря

3 ответа

Соответственно, ваше регулярное выражение совпадает с самой длинной строкой, которая находится между "Here" и "String". То есть, действительно, "Вот строка" Вот строка ". Это поведение по умолчанию квантора *.

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a String Here is a

Если вы хотите соответствовать кратчайшему, вы можете поставить ? (модификатор жадности) сразу после квантификатора *:

$ echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*?(?= String)'
is a
is a


sed 's/ String.*//;s/.*Here //'


Чтобы получить первое слово, вы можете использовать grep -o '^[^ ]*':

echo "Here is a String Here is a String" | grep -Po '(?<=(Here )).*(?= String)' | grep -o '^[^ ]*'

И вы можете тратить grep на grep несколько раз, чтобы составлять простые команды в сложные.

licensed under cc by-sa 3.0 with attribution.