GNU sed указывает конечную позицию при добавлении текста

Я хочу сделать две вещи sed при сопоставлении с шаблоном:

  1. Заменить шаблон на строку
  2. Добавить еще одну строку после этой строки

Например, исходный контент в текстовом файле:

abc
123
edf

Я хочу заменить 123 в XXX и добавить YYY после строки:

abc
XXX
YYY
edf

Я пытался сделать это путем sed '/123/{s/123/XXX;a\YYY\}', но это дало ошибку: Unmatched "{",

Казалось, что команда a обрабатывает все символы после него как текст для добавления. Так как я могу сделать a знать конечную позицию текста для добавления?

4 ответа

Решение

Это может работать для вас (GNU sed):

sed '/123/c\XXX\nYYY' file

Это использует c Команда для изменения строки, соответствующей шаблону.

Или, если вы предпочитаете заменить и добавить:

sed 's/123/XXX/;T;a\YYY' file

Или же:

sed -e '/123/{s//XXX/;a\YYY' -e '}' file

Или же:

sed $'/123/{s//XXX/;a\YYY\n}' file 

Работает с использованием реальных строк (протестировано с GNU Sed 4.2.2):

sed '/123/ {
    s/123/XXX
    a\YYY
}' < $input_file

В bash это может быть самым простым, используя sed:

sed  -e $'s/123/XXX\\nYYY/' file

От bash человек:

Слова вида $'string' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C

пример

$ sed  -e 's/123/XXX\\nYYY/' file
abc
XXX\nYYY
edf

Но $'string' будет производить:

$ sed  -e $'s/123/XXX\\nYYY/' file
abc
XXX
YYY
edf
$ sed 's/123/XXX\'$'\nYYY/' a
abc
XXX
YYY
def
$

Куда...

$ cat a
abc
123
def
$
Другие вопросы по тегам