如何使用“sed -e”插入文本

时间:2017-12-20 10:41:32

标签: bash sed

例如,我有一个名为test_sed的文件,它的内容是这样的:

abc
def
ghi
jkl

当有三个连续的行(如abc\ndef\nghi)时,我想插入内容,例如“hello world”。所以我使用sed -f test.sed test_sed。脚本test.sed的编写如下:

:begin
/abc/,/ghi/ {
  /ghi/! {
    $! {
      N;
      b begin
    }
  }
  /abc.*ghi/a hello world
}

它有效。但是当我在命令行中写这样的时候:

sed -e ":begin; /abc/,/ghi/ { /ghi/! { $! { N; b begin }; }; /abc.*ghi/a hello world };" test_sed

它不起作用,我不知道如何纠正它。

4 个答案:

答案 0 :(得分:0)

您应该使用单引号来阻止bash扩展感叹号(!):

sed -e ':begin; /abc/,/ghi/ { /ghi/! { $! { N; b begin }; }; /abc.*ghi/a hello world };' test_sed
       ^                                                                               ^

好像你需要强行插入一个换行符让sed停止插入,这对我有用:

$ sed -e ':begin; /abc/,/ghi/ { /ghi/! { $! { N; b begin }; }; /abc.*ghi/a hello world
 };' test_sed

答案 1 :(得分:0)

如果您有perl,则使用slurp模式会更容易:

perl -0777 -pe 's~abc\Rdef\Rghi\R~$&hello world\n~' file

abc
def
ghi
hello world
jkl

或者,您可以使用awk

awk '$1=="abc"{s=$1; for (i=1; i<=2; i++) {
     getline; s = s RS $1 } if (s=="abc\ndef\nghi") $0 = s RS "hello world"} 1' file

abc
def
ghi
hello world
jkl

答案 2 :(得分:0)

sed很挑剔。特别是,您似乎使用的版本允许a命令不会立即后跟换行符,因此尽管以下内容适用于BSD,但它可能不适用于gnu-sed:

$ sed -e ':begin
/abc/,/ghi/ { /ghi/! { $! { N; b begin
}; }; /abc.*ghi/a\
hello world
};' input

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '/abc/!b;n;/def/!b;n;/ghi/a\hello world' file

如果第一行包含abc,则第二行包含def,第三行包含ghi,然后附加hello world

更强大的解决方案:

sed ':a;N;s/\n/&/2;Ta;/abc.*\n.*def.*\n.*ghi/!P;//!D;a\hello world' file

这允许重试失败。