找到与sed匹配后如何追加一行?

时间:2014-05-28 04:39:34

标签: regex linux bash sed

我想在'maildomain'行后面的port附加一个php文件。我真的想使用这个solution,因为这似乎是最干净,非常清楚,所以我做了

sed -i "350,/port/a \'maildomain\'" file.php

但它出现了这样:

351 : 'maildomain'
352 : 
353 : 'maildomain'
354 : 
...
358 : blablabla port blabla
359 : 'maildomain'

如您所见,它从第350行交替添加'maildomain',直到找到最初位于第354行的port。如何修改上面的sed命令只是在'maildomain'之后而不是之前添加port?谢谢。

另外,当使用353而不是350时,它给了我:

353 : 'maildomain'
354 : balsdbflasdbflsd port blablablabla
355 : 'maildomain'

为什么呢?感谢〜

3 个答案:

答案 0 :(得分:5)

表单x,y的地址表示从xy包含的所有行,因此350,/port/表示从350到该行的每一行匹配/port/正则表达式。

如果您只想在/port/行之后追加,请指定该地址:

sed -i "/port/a \'maildomain\'" file.php

答案 1 :(得分:3)

如果您希望在包含'maildomain'的任何行之后添加port,则Barmar会有正确答案。但是,如果您有许多此类行包含port并且只希望在行号350之后添加,那么您可以执行以下操作:

sed -i "350,/port/{
    /port/a \'maildomain\'
}" file.php

这将查找第350行之后的行以及其中包含port的任何行,它将在其后附加'maildomain'。注意我是如何在多行上拆分命令的。你也需要这样做。这是因为a中的sed命令需要一个实际的换行符。

如果您只希望在第350行之后添加一次,那么您可以在完成添加后分出b

sed -i "350,/port/{
    /port/a \'maildomain\'
    b;
}" file.php

答案 2 :(得分:0)

如果我正确理解您的要求,您可以使用Barmar的解决方案在sed中完成此操作。

或者你可以使用awk:

awk '1;/port/{print "maildomain"}'

这将打印当前行,然后测试当前行是否包含您的关键字,如果是,则打印额外行。

或者,既然您已经提到了bash标记,那么您可以在纯粹的bash中执行此操作:

while read line; do echo "$line"; [[ $line =~ port ]] && echo "maildomain"; done

这实现了与awk解决方案完全相同的逻辑,但没有启动外部解释器。