基本思路是查找函数规范行直到函数结束行,并在该范围内,在函数结束行之前插入额外的文本:
it59.sed
/^hello()/,/^}/ { /^}/i\
insert new line of text "goodbye" here
}
用法
sed -f it59.sed file1.sh file2.sh
或者,使用 GNU sed 进行原位编辑:
sed -i -f it59.sed file1.sh file2.sh
或者,使用 BSD 进行原位编辑sed:
sed -i '' -f it59.sed file1.sh file2.sh
等等
输入示例
hello()
{
echo "line 1"
echo "line 2"
#insert new line of text "good bye" here
}
hello()
{
echo "line 1"
echo "line 2"
echo "line 3"
echo "line 4"
#insert new line of text "good bye" here
}
示例输出
hello()
{
echo "line 1"
echo "line 2"
#insert new line of text "good bye" here
insert new line of text "goodbye" here
}
hello()
{
echo "line 1"
echo "line 2"
echo "line 3"
echo "line 4"
#insert new line of text "good bye" here
insert new line of text "goodbye" here
}
请注意,sed 忽略了前导空格。这很麻烦。解决这个问题有点困难。
it61.sed
/^hello()/,/^}/ { /^}/ { h; s/.*/ insert new line of text "goodbye" here/p; x; }; }
对于从函数开头到函数结尾的范围,如果该行与函数结尾匹配,则将该行复制到保留空间,将该行替换为新文本并打印该行,并且交换保留空间。 } 后面的分号是 BSD sed 需要的,但 GNU sed 不需要。当然,那一行也可以写在命令行上。多行版本 (it59.sed) 在命令行上编写时需要小心 — 同样,GNU sed 与 BSD sed 有不同的规则,并允许 BSD sed 不允许的事情。 (在这些问题上,POSIX sed 比 GNU sed 更接近 BSD sed。)
示例输出
hello()
{
echo "line 1"
echo "line 2"
#insert new line of text "good bye" here
insert new line of text "goodbye" here
}
hello()
{
echo "line 1"
echo "line 2"
echo "line 3"
echo "line 4"
#insert new line of text "good bye" here
insert new line of text "goodbye" here
}