我想sed在匹配模式时做两件事:
- 用字符串替换模式
- 在此行之后附加另一个字符串
比如一个文本文件中的原始内容是:
abc
123
edf
我想替换123到并在该行之后XXX追加:YYY
abc
XXX
YYY
edf
我试图这样做sed '/123/{s/123/XXX;a\YYY\}',但它给出了一个错误:Unmatched "{"。
似乎该命令a将其后的所有字符视为要附加的文本。那么我怎样才能知道append 文本a的结束位置呢?
它使用实际的换行符(使用 GNU Sed 4.2.2 测试)工作:
sed '/123/ {
s/123/XXX
a\YYY
}' < $input_file
这可能对您有用(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
这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
$