例如,我有一个名为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
它不起作用,我不知道如何纠正它。
答案 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
这允许重试失败。