GNU sed 在附加文本时指定结束位置

GNU sed specify the end position when appending text

我想在匹配模式时通过 sed 做两件事:

  1. 用字符串替换模式
  2. 在这一行之后追加另一个字符串

比如一个文本文件中的原始内容是:

abc
123
edf

我想将 123 替换为 XXX 并在行后附加 YYY

abc
XXX
YYY
edf

我尝试通过 sed '/123/{s/123/XXX;a\YYY\}' 执行此操作,但出现错误:Unmatched "{"

命令 a 似乎将其后的所有字符视为 文本以追加 。那么我怎样才能让a知道追加的文本的结束位置呢?

bash 中,这可能是 最简单的 使用 sed:

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

来自 bash 人:

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard

例子

$ 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
$

它可以使用实际的换行符(使用 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