awk搜索模式在文件中。替换匹配上的线并打印,因为它不匹配

时间:2012-07-26 15:39:52

标签: shell replace sed awk match

我有一个像这样的TAB分隔文件:

sample.rpt:

54 67 common/bin/my/home {{bla bla bla}} {bla bla} ReplaceMe

89 75 bad/rainy/day/out {{ some bla} } {some bla} DontreplaceMe

我希望在第3项上进行正则表达式匹配,比如common/bin/my/home 如果有匹配,我想替换第6项Replace Me 我自己的文字,如happy Home

另外我的regexp将是一个shell变量,所以我需要一个命令 它接受regexp作为变量

项目可能包含空格或反斜杠,文件为Tab 分离。

为实现这一点,我使用了以下awk单行程序:

下面我要检查字段3是否与drv指定的模式匹配, 然后做大括号{}

中的任何事情
awk -F "\t" -v drv=$mod_pat '$3 ~ drv \
  { OFS= "\t"; $6 = " happy_home"; print;}' sample.rpt

现在的问题是,如果是,我想打印线不变 模式不匹配。这可能在同一个命令中吗?

我试过了:

awk -F "\t" -v drv=$mod_pat \
  'if ($3 ~ drv) { OFS= "\t"; $6 = " happy_home"; print;} else {print;}' sample.rpt

但它的抛出解析错误。可能是awk语法的一些问题。

2 个答案:

答案 0 :(得分:3)

1是一种默认操作{print $0}的模式 http://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html

awk -F\t -v OFS=\t -v drv="home" '$3~drv{$6=" happy_home"} 1' sample.rpt 

答案 1 :(得分:1)

如果您要使用“{}”语句,则awk程序周围需要if。 E.g:

awk -F "\t" -v drv=$mod_pat '{ if ($3 ~ drv) { OFS= "\t"; $6 = " happy_home"; print;} else {print;} }' sample.rpt