在Unix shell脚本中匹配2个模式后附加一行

时间:2013-05-15 04:09:04

标签: perl unix sed awk

我有一个像

这样的文件
nithin shetty
sachin shetty
pavan shetty

在这个文件中我想追加“你好我是我”,下一行是“shetty”模式。但条件是,如果该行匹配“nithin”,则不要追加该行。 我知道如何在模式匹配后追加一行,

sed '/shetty/a\
  HELLO THIS IS ME
' filename`

但在此我不想要包含nithin的行。输出应该是这样的:

nithin shetty
sachin shetty
  HELLO THIS IS ME
pavan shetty
  HELLO THIS IS ME

有可能吗?

3 个答案:

答案 0 :(得分:3)

sed解决方案的形式如下:

sed '/nithin/b; /shetty/a\ HELLO THIS IS ME' filename
在没有标签的情况下,

b会导致sed跳转到脚本的末尾。

答案 1 :(得分:2)

抱歉,我不知道sed,但我知道Perl。

perl -nE'print; say "HELLO THIS IS ME" if /shetty/ && !/nithin/'

perl -pe'$_ .= "HELLO THIS IS ME\n" if /shetty/ && !/nithin/'

sed一样,

  • 如果没有命名文件,将从命名文件或stdin读取行。
  • 输出将发送到stdout。
  • 您可以使用-i进行就地编辑。

答案 2 :(得分:0)

以下是使用awk执行此操作的一种方法:

awk '!/nithin/ && /shetty/ { $0 = $0 "\n  HELLO THIS IS ME" } 1' infile

输出:

nithin shetty
sachin shetty
  HELLO THIS IS ME
pavan shetty
  HELLO THIS IS ME