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 с использованием обратных ссылок, как-то было связано, но я не уверен!
Ответы
Ответ 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