Подтвердить что ты не робот

Sed - Получить только замененную строку из многострочного ввода и пропустить непревзойденные строки!

Я хочу, чтобы sed пропускал все несоответствующие строки и выводил только замененную строку (из одной/нескольких намеченных строк/строк).

Другими словами: У меня есть стека сена, и я хочу, чтобы игла вернулась, а не весь сено, которое было обыскано и которое оставалось неизменным.

Или, другими словами: Искать или заменять описанную строку RegEx в многострочной строке и получать только эту строку. (Как это возможно с помощью функции PHP http://www.php.net/manual/en/function.preg-replace.php)

Мое текущее обходное решение состоит в том, чтобы сначала фильтровать с помощью grep, а затем передавать только совпадающие строки в sed для замены:

echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla" | egrep "^Important1.*$" | sed -E "s/^Important1: *\b(.*)\b */\1/g"
# From the multiple line input I only want the "One One" (with pre/post whitespace removed, hence matching the word boundaries with "\b")
# And I want no "Bla bla" lines in the result!

Но я бы хотел иметь одно решение в sed. Или это из-за предполагаемого использования sed, и должен ли я лучше использовать что-то еще? Btw, issue: multiline sed с использованием обратных ссылок, как-то было связано, но я не уверен!

4b9b3361

Ответ 1

EDIT: После тестирования были протестированы как на Mac, так и на Linux.

Вы можете использовать sed следующим образом:

echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla" | \
   sed -n 's/^Important1: *\([^ ]*\) */\1/p'

OUTPUT:
one

Объяснение

sed -n 's/^Important1: *\([^ ]*\) */\1/p'

-n # quiet / silent 

{
  s/^Important1: *\([^\ ]*\) */\1/ # replace "Important1: one " with 1st group i.e. "one"
  p                  # print the replaced text
}

Ответ 2

Эта команда sed делает то, что делает ваша комбинация egrep и sed:

echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla"
| sed -n -e "s/^Important1: *\b\(.*\)\b */\1/p"

Вы выполняете подстановку и только строки печати, которые соответствуют после замены.

Ответ 3

sed -n '/^Important1.*$/s/^Important1: *\b\(.*\)\b */\1/p'

Доказательство концепции

$ echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla" | sed -n '/^Important1.*$/s/^Important1: *\b\(.*\)\b */\1/p'
One