在sed中添加两行

时间:2012-02-26 05:49:48

标签: bash sed

我想在第一次字符串搜索后添加两行。我正在使用:

$ cat file1
HAI
BYE
HAI
ONE
TWO

$ VAR=`cat -n file1 |grep -w HAI |head -1 |awk '{print $1}'`
$ sed "$VAR a\
LINE ONE \
LINE TWO
" file1

它提供以下输出。

HAI
LINE ONE LINE TWO
BYE
HAI
ONE
TWO

但我希望输出为:

HAI
LINE ONE 
LINE TWO
BYE
HAI
ONE
TWO

我怎样才能做到这一点?我试图保留\ n但它却给出错误。

3 个答案:

答案 0 :(得分:4)

用以下代码替换你的sed命令:

sed $VAR' a\
LINE ONE\
LINE TWO
' file1
等等你的早期grep,awk也可以简化为:

VAR=$(awk '$1 == "HAI" && NR==1{print NR}' file1)

好多了是在这样的单一awk命令中获得完整答案:

awk '{if ($1=="HAI" && done!=1) {done=1; printf("%s\nLINE ONE\nLINE TWO\n", $0);} \
      else print $0}' file1

<强>输出:

HAI
LINE ONE
LINE TWO
BYE
HAI
ONE
TWO

答案 1 :(得分:2)

$ sed '/HAI/{s/.*/&\nLINE ONE\nLINE TWO/;:a;n;ba}' file1
HAI
LINE ONE
LINE TWO
BYE
HAI
ONE
TWO

说明:

  • /HAI/ 搜索此模式
  • s/.*/&\nLINE ONE\nLINE TWO/ 追加两行
  • :a 定义标签(a)
  • n 阅读下一行
  • ba 跳转到标签(a)

您可以使用a命令代替s

$ sed '
> /HAI/{
> a\
> LINE ONE\
> LINE TWO
> :a
> n
> ba
> }' file1

答案 2 :(得分:0)

这可能适合你(GUN sed):

sed '0,/HAI/a\LINE ONE\nLINE TWO' file

或者这(任何sed):

sed 'x;/./{x;b};x;/HAI/!b;h;a\LINE ONE\nLINE TWO' file