1

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

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

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

abc
123
edf

我想替换123到并在该行之后XXX追加:YYY

abc
XXX
YYY
edf

我试图这样做sed '/123/{s/123/XXX;a\YYY\}',但它给出了一个错误:Unmatched "{"

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

4

4 回答 4

2

它使用实际的换行符(使用 GNU Sed 4.2.2 测试)工作:

sed '/123/ {
    s/123/XXX
    a\YYY
}' < $input_file
于 2015-12-31T07:24:05.140 回答
2

这可能对您有用(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 
于 2015-12-31T10:33:01.887 回答
1

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
于 2015-12-31T07:16:47.990 回答
0
$ sed 's/123/XXX\'$'\nYYY/' a
abc
XXX
YYY
def
$

在哪里...

$ cat a
abc
123
def
$
于 2015-12-31T07:18:32.707 回答