Команда
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file
печатает абзацы, содержащие строку AAA
.
Это вызывает sed
со следующим сценарием sed
:
/./{
H
$!d
}
x
/AAA/!d
Аннотированная версия:
/./{ # When hitting a line that contains at least one character...
H; # Append the line to the "hold space".
$!d; # If it's not the last line, delete it.
}
x; # Swap the hold space and the pattern space.
/AAA/!d; # Delete the pattern space if it does not contain the string "AAA"
# (implicit print)
Итак, вкратце, он собирает строку за строкой в «удерживаемом пространстве» (буфере общего назначения в sed
), и когда находит пустую строку (шаблон /./
не соответствует ), он определяет, содержит ли сохраненная коллекция строк строку AAA
, и печатает ее, если она есть.
Это также описано в ответе здесь:GREP/SED или AWK :Печатать весь абзац в файле при совпадении с образцом
Учитывая файл
this is
a paragraph
this is
another one
this paragraph
contains the string
AAA
Последний абзац (будет выводиться с начальной пустой строкой ).
Чтобы избавиться от пустой строки, которая будет предшествовать каждому выводимому абзацу (, если это то, что вам нужно ), используйте
/./{
H
$!d
}
x
/AAA/!d
s/\n//
Или в командной строке
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;s/\n//'
История команд вашей текущей оболочки записывается в историю.bash _, когда вы закрываете оболочку. Поэтому, хотя обычно все последние команды доступны из оболочки, они еще не добавлены в файл истории.bash _.