GNU sed указывает конечную позицию при добавлении текста
Я хочу сделать две вещи sed
при сопоставлении с шаблоном:
- Заменить шаблон на строку
- Добавить еще одну строку после этой строки
Например, исходный контент в текстовом файле:
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
$