Заменить первое вхождение на sed - PullRequest
0 голосов
/ 11 мая 2018

Как показано в примере ниже, я хочу оставить только слово перед first 'Джон'.

Однако шаблон, который я применил, похоже, заменяет Джона от конца до головы. Поэтому мне нужно дважды позвонить в sed.

Как мне найти правильный путь?

PATTERN="I am John, you are John also"
OUTPUT=$( echo "$PATTERN" | sed -r "s/(^.*)([ \t]*John[ ,\t]*)(.*$)/\1/" )
echo "$OUTPUT"
OUTPUT=$( echo "$OUTPUT" | sed -r "s/(^.*)([ \t]*John[ ,\t]*)(.*$)/\1/" )
echo "$OUTPUT"

Я ожидаю, что звоню только один раз. Поскольку, если «Джон» появится несколько раз, это будет проблемой.

В соответствии с процедурой, приведенной выше, он будет генерировать вывод в виде:

Во-первых, оно соответствует и обрезает слово после последнего Иоанна; затем первый Джон.

Я Джон, а вы

Я

Я хочу выполнить один раз и получить

Я

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Awk решение:

s="I am John, you are John also and there is another John there"
awk '{ sub(/[[:space:]]+John.*/, "") }1' <<<"$s"

Выход:

I am
0 голосов
/ 11 мая 2018

Другой способ сделать это - использовать команду grep в режиме Perl:

echo "I am John, you are John also" | grep -oP '^(?:(?!John).)*';
I am 
#there will be a space at the end
echo "I am John, you are John also" | grep -oP '^(?:(?!John).)*(?=\s)';
I am
#there is no space at the end

Regex объяснения:

^(?:(?!John).)*

Примут все символы от начала строк до первого John.

Regex demo

0 голосов
/ 11 мая 2018

После sed может помочь вам в том же.

echo "I am John, you are John also" | sed 's/ John.*//'

Или с переменными.

pattern="I am John, you are John also"
output=$(echo "$pattern" | sed 's/John.*//')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...