我想在第一次字符串搜索后添加两行。我正在使用:
$ 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但它却给出错误。
答案 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