【问题标题】:awk search pattern in file. replace line on match and print as it is on not match文件中的 awk 搜索模式。替换匹配的行并打印,因为它不匹配
【发布时间】:2012-07-25 06:09:15
【问题描述】:

我有一个像这样的 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

另外,我的正则表达式将是一个 shell 变量,所以我需要一个命令 它接受正则表达式作为变量

项目可能有空格或反斜杠,文件是 Tab 分开。

为了实现这一点,我使用了以下 awk one-liner:

下面我正在检查字段 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 语法有问题。

【问题讨论】:

标签: shell replace sed awk match


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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 
    

    【讨论】:

    • 感谢一个小小的修改帮助了我: awk -F "\t" -v drv=$mod_pat '$3 ~ drv \ { OFS= "\t"; $6 = "happy_home";} 1' 示例.rpt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多