【问题标题】:awk – how to put a regexp in a variable if I want to use it within if/else logic?awk – 如果我想在 if/else 逻辑中使用正则表达式,如何将它放入变量中?
【发布时间】:2015-01-21 20:06:57
【问题描述】:

当我应用此代码时:

gawk '{ if ($0 ~ /cat|dog/) {
print "animal" }
else if ($0 ~ /[[:digit:]]+/) {
print "number" }
else { print "unknown" } }' path/to/input.txt > path/to/output.txt

到这个输入:

100
cat
200
something
dog

我看到了想要的输出:

number
animal
number
unknown
animal

很好。但是当我使用这段代码时:

gawk 'BEGIN {animals = /cat|dog/; 
digits = /[[:digit:]]+/ }
{ if ($0 ~ animals) {
print "animal" }
else if ($0 ~ digits) {
print "number" }
else { print "unknown" } }' path/to/input.txt > path/to/output.txt

我看到这个输出:

animal
unknown
animal
unknown
unknown

发生了什么事?真是奇怪又不可预测!

【问题讨论】:

  • 如果您使用/ 作为正则表达式分隔符,则在将其分配给变量时必须使用~ 符号。

标签: regex shell unix command-line awk


【解决方案1】:

您需要像这样存储和重用正则表达式:

gawk 'BEGIN {animals = "cat|dog"; digits = "[[:digit:]]+" }
{ if ($0 ~ animals) {
   print "animal" }
else if ($0 ~ digits) {
print "number" }
else { print "unknown" } }' path/to/input.txt > path/to/output.txt

即将其存储在变量中时不要使用正则表达式分隔符。

【讨论】:

    猜你喜欢
    • 2012-07-17
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2011-10-26
    • 2015-05-17
    • 2015-12-24
    相关资源
    最近更新 更多