awk&x2013;如果我想在if/else逻辑中使用regexp,如何将其放入变量中?

awk&x2013;如果我想在if/else逻辑中使用regexp,如何将其放入变量中?,regex,shell,unix,command-line,awk,Regex,Shell,Unix,Command Line,Awk,当我应用此代码时: gawk '{ if ($0 ~ /cat|dog/) { print "animal" } else if ($0 ~ /[[:digit:]]+/) { print "number" } else { print "unknown" } }' path/to/input.txt > path/to/output.txt gawk 'BEGIN {animals = /cat|dog/; digits = /[[:digit:]]+/ } { if ($0 ~ a

当我应用此代码时:

gawk '{ if ($0 ~ /cat|dog/) {
print "animal" }
else if ($0 ~ /[[:digit:]]+/) {
print "number" }
else { print "unknown" } }' path/to/input.txt > path/to/output.txt
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
对于此输入:

100
cat
200
something
dog
我看到了期望的输出:

number
animal
number
unknown
animal
很好。但当我使用此代码时:

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

发生什么事了?真的很奇怪和不可预测

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

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

i、 e.在变量中存储时不要使用正则表达式分隔符。

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