Ваша версия sed, по-видимому, не поддерживает \n
в RHS (правая часть замещения).Чтобы выбрать одно из возможных решений, прочитайте FAQ по SED , которое ведет Эрик Пимент.Я предлагаю попробовать сначала вставить буквальный символ новой строки.
Ниже приводится цитата из него.
4.1.Как вставить новую строку в RHS замены?
Несколько версий sed позволяют вводить \n
непосредственно в RHS, который затем преобразуется в новую строку при выводе: ssed,gsed302a +, gsed103 (с переключателем -x
), sed15 +, sedmod и UnixDOS sed.Самое простое решение - использовать одну из этих версий.
Для других версий sed попробуйте одну из следующих:
(a) Если вы набираете скрипт sed изв оболочке Bourne используйте одну обратную косую черту \
, если в сценарии используются «одинарные кавычки», или две обратные косые черты \\
, если для сценария требуются «двойные кавычки».В приведенном ниже примере обратите внимание, что оболочка >
во 2-й строке генерируется оболочкой, чтобы запросить у пользователя дополнительные данные.Пользователь вводит косую черту, одинарные кавычки и затем ENTER, чтобы завершить команду:
[sh-prompt]$ echo twolines | sed 's/two/& new\
>/'
two new
lines
[bash-prompt]$
(b) Использовать файл сценария с одной обратной косой чертой \
в сценарии,сразу же после новой строки.Это вставит новую строку в часть «заменить».Пример:
sed -f newline.sed files
# newline.sed
s/twolines/two new\
lines/g
Некоторые версии sed могут не нуждаться в обратной косой черте.Если это так, удалите его.
(c) Вставьте неиспользуемый символ и направьте вывод через tr:
echo twolines | sed 's/two/& new=/' | tr "=" "\n" # produces
two new
lines
(d) Используйте команду G
:
G добавляет новую строку, а также содержимое области удержания в конец области шаблона.Если пространство удержания пусто, новая строка добавляется в любом случае.Новая строка сохраняется в пространстве шаблонов как \n
, где ее можно найти, сгруппировав \(...\)
и переместив ее в RHS.Таким образом, для изменения примера «twolines», использовавшегося ранее, будет работать следующий скрипт:
sed '/twolines/{G;s/\(two\)\(lines\)\(\n\)/\1\3\2/;}'
(e) Вставка полных строк, без разбивки строк:
Если вы не меняете строки, а вставляете только целые строки до или после шаблона, процедура будет намного проще.Используйте команду i
(вставка) или a
(добавление), внося изменения с помощью внешнего скрипта.Чтобы вставить This line is new
ДО каждой строки, соответствующей регулярному выражению:
/RE/i This line is new # HHsed, sedmod, gsed 3.02a
/RE/{x;s/$/This line is new/;G;} # other seds
Два приведенных выше примера предназначены для ввода однострочных команд с консоли.Если используется сценарий sed, i\
, за которым сразу следует буквальный перевод строки, будет работать на всех версиях sed.Кроме того, команда s/$/This line is new/
будет работать только в том случае, если пространство удержания уже пусто (что по умолчанию).
Для добавления This line is new
ПОСЛЕ каждой строки, соответствующей регулярному выражению:
/RE/a This line is new # HHsed, sedmod, gsed 3.02a
/RE/{G;s/$/This line is new/;} # other seds
Чтобы добавить 2 пустые строки после каждой строки, соответствующей регулярному выражению:
/RE/{G;G;} # assumes the hold space is empty
Чтобы заменить каждую строку, соответствующую регулярному выражению, на 5 пустых строк:
/RE/{s/.*//;G;G;G;G;} # assumes the hold space is empty
(f) Если возможно, используйте команду y///
:
В некоторых версиях sed для Unix (не в GNU sed!), Хотя команда s///
не будет принимать \n
в RHS, y///
команда делает.Если ваш Unix sed поддерживает это, можно вставить новую строку после aaa
таким образом (который не переносится в GNU sed или другие seds):
s/aaa/&~/; y/~/\n/; # assuming no other '~' is on the line!