我想在'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'
为什么呢?感谢〜
答案 0 :(得分:5)
表单x,y
的地址表示从x
到y
包含的所有行,因此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
解决方案完全相同的逻辑,但没有启动外部解释器。