使用变量初始化awk中的正则表达式

时间:2013-06-01 13:05:33

标签: variables design-patterns awk match

我想用正则表达式初始化变量,然后将其用于模式匹配。结果没有达到预期。例如,我有,

  BEGIN {
    item_code_pattern=/ITM-CD-10/ ;
   }

   $0 ~ $item_code_pattern{ print ; }  

我看到没有ITM-CD-10模式的记录也出现在输出中。 请在块之前建议正确的布尔表达式。

由于

2 个答案:

答案 0 :(得分:3)

您想使用常规字符串:

awk '
  BEGIN {
    item_code_pattern = "ITM-CD-10" ;
  }

  $0 ~ $item_code_pattern { print ; } 
'

/pattern/构造检查$0是否与给定的模式匹配,因此您的原始代码等同于:

item_code_pattern = $0 ~ "ITM-CD-10"

由于$0部分中BEGIN为空,item_code_pattern设为0。

答案 1 :(得分:2)

您需要删除$/符号(并且不需要BEGIN块,只需在命令行上分配变量):

awk '$0 ~ item_code_pattern' item_code_pattern=ITM-CD-10

当您使用$时,某些版本的awk会发出错误,而其他版本会默默地将变量转换为0的整数值,以便$item_code_pattern$0完全相同,代码$0 ~ $item_code_pattern是重言式$0 ~ $0

如果您坚持使用BEGIN块,则语法为:

 BEGIN { item_code_pattern="ITM-CD-10" }
 $0 ~ item_code_pattern

请注意,{ print }是没有给出规则的默认规则,因此它是多余的。