Bash,Perl或Sed,在找到的短语后插入新行

时间:2011-07-20 12:20:43

标签: perl bash sed awk

好的我想我需要做以下事情:

/var/lib/asterisk/bin/retrieve_conf中搜索此行代码:

$engineinfo = engine_getinfo();

紧跟以下两行后插入:

$engineinfo['engine']="asterisk";
$engineinfo['version']="1.6.2.11";

提前致谢, 乔

6 个答案:

答案 0 :(得分:7)

你可以这样做

sed -ne '/$engineinfo = engine_getinfo();/a\'$'\n''$engineinfo['engine']="asterisk";\'$'\n''$engineinfo['version']="1.6.2.11";'$'\n'';p' /var/lib/asterisk/bin/retrieve_conf

在您确认其有效后,添加-i进行修改。

它做什么以及如何运作?

首先我们告诉sed匹配包含字符串的行。在那个匹配的行上,我们将执行a命令,即“追加文本”。

sed a命令的语法是

a\
line of text\
another line
;

请注意,文字换行符是此语法的一部分。为了使所有一行(并保留复制粘贴能力)代替文字换行,我使用了$'\n',它将告诉bash或zsh插入一个真正的换行符。进行此工作所需的引用有点复杂:您必须退出单引号,以便可以通过bash解释$'\n',然后您必须重新输入单引号字符串以防止bash解释其余的输入。

编辑:更新后将两行添加到一个追加命令中。

答案 1 :(得分:1)

您可以使用Perl和Tie::File(包含在Perl发行版中):

use Tie::File;
tie my @array, 'Tie::File', "/var/lib/asterisk/bin/retrieve_conf" or die $!; 
for (0..$#array) {
    if ($array[$_] =~ /\$engineinfo = engine_getinfo\(\);/) {
        splice @array, $_+1, 0, q{$engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11";};
        last;
    }   
}

答案 2 :(得分:1)

为了对称,这里是使用awk的答案。

awk '{ if(/\$engineinfo = engine_getinfo\(\);/) print $0"\n$engineinfo['\''engine'\'']=\"asterisk\";\n$engineinfo['\''version'\'']=\"1.6.2.11\"" ; else  print $0 }' in.txt

答案 3 :(得分:1)

您也可以使用ed

# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | ed -s /var/lib/asterisk/bin/retrieve_conf
H
/\$engineinfo = engine_getinfo();/a
$engineinfo['engine']="asterisk";
$engineinfo['version']="1.6.2.11";
.
wq
EOF

答案 4 :(得分:1)

Perl one-liner:

perl -pE 's|(\$engineinfo) = engine_getinfo\(\);.*\K|\n${1}['\''engine'\'']="asterisk";\n${1}['\''version'\'']="1.6.2.11";|' file

答案 5 :(得分:0)

sed -i  's/$engineinfo = engine_getinfo();/$engineinfo = engine_getinfo();<CTRL V><CNTRL M>$engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11";/' /var/lib/asterisk/bin/retrieve_conf