Команды в sed
разделены переводом строки. Чтобы сопоставить многострочные строки, вы можете прочитать несколько строк в шаблонном пространстве с помощью команды N
, а затем сопоставить их с регулярным выражением \n
для сопоставления новой строки. Если совпадение не найдено, вы должны перемешать с пробелом: удерживать пробел, печатать все до новой строки, переключать пробел с пробелом, удалять из паттерна все до первой новой строки, читать следующую строку, повторять.
Это было бы что-то вроде:
sed '
: restart
N;N;N;N;N; # read six lines, we need that many
: loop
# match six lines
/ type pulse\n fallback "sysdefault"\n hint {\n show on\n description "Default ALSA Output (currently PulseAudio Sound Server)"\n }/{
# replace them
s// type plug\n slave.pcm hw/
# print and start over
n ; b restart
}
# hold, print leading line, change, remove leading line
h ; s/\n.*// ; p ; x ; s/[^\n]*\n//
# append next line and loop
N
b loop
'
Поскольку написание таких скриптов сложно (для большинства людей;), некоторые просто используют GNU sed -z
option:
sed -z 's/ type pulse\n fallback "sysdefault"\n hint {\n show on\n description "Default ALSA Output (currently PulseAudio Sound Server)"\n }/ type plug\n slave.pcm hw/g'
Заметьте, я думаю, что использование \n
в строке замены внутри команды s
в любом случае является расширением GNU.