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

时间:2015-12-31 06:44:00

标签: sed gnu-sed

我希望在匹配模式时按sed执行两项操作:

  1. 用字符串
  2. 替换图案
  3. 在此行后附加另一个字符串
  4. 例如文本文件中的原始内容是:

    abc
    123
    edf
    

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

    abc
    XXX
    YYY
    edf
    

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

    似乎命令a将其后的所有字符视为 要追加的文字 。那么如何让a知道 文字的结尾位置

4 个答案:

答案 0 :(得分:2)

使用实际换行符(使用GNU Sed 4.2.2测试):

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

答案 1 :(得分: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 

答案 2 :(得分:1)

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

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

来自bash男人:

  

$'string'形式的单词是专门处理的。这个词扩大了   to 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

答案 3 :(得分:0)

$ sed 's/123/XXX\'$'\nYYY/' a
abc
XXX
YYY
def
$

WHERE ...

$ cat a
abc
123
def
$