在模式匹配中组合变量和正则表达式

在模式匹配中组合变量和正则表达式

我希望在文件中搜索由 3 个字母后跟任意 3 或 4 个数字组成的列。例如。

if ( $1 ~ /^[A-Z][A-Z][A-Z][0-9][0-9][0-9]/) 

但是我需要这 3 个字母作为变量,所以我正在寻找结果

SP="ABC" 
if ( $1 ~ /^/SP/[0-9][0-9][0-9]/)>

然而,这是行不通的。如何在搜索模式中组合变量和正则表达式?

答案1

SP="ABC" 
if ( $1 ~ "^" SP "[0-9]{3}")

您可以串联字符串但不是/xxx/s 实际上更像正则表达式匹配运算符,并且解析规则可能会令人困惑(并且在实现之间有所不同)

$1 ~ /ABC/ /BCD/

可以被视为$1匹配的串联与/ABC/(1或0取决于是否$0匹配/ABC/)和/BCD/(1或0取决于是否$0匹配/BCD/)的串联,或者$1匹配对/ABC/(0或1)与$0匹配的串联/BCD/,这会很令人困惑,除了该/regexp/运算符与其他运算符(例如此处的串联运算符)结合使用时效果不佳,因为可能与/除法运算符混淆。

但有了括号,你会变得有趣(阅读越野车)行为:

$ echo 11 ab | gawk '{print $1 ~ /a/ (/b/)}'
1
$ echo 11 ab | bwk-awk '{print $1 ~ /a/ (/b/)}'
01
$ echo b | bwk-awk '{print /a/ - (/b/)}'
0-1

(后一个是/a/(0) 与 的结果连接的结果- (/b/))。


请注意,在 中$1 =~ "^" SP "[0-9]{3}",SP 的内容仍被视为正则表达式(如果是...,则匹配 3 个字符,而不是 3 个点);如果不想要这样:

if (index($1, SP) == 1 && substr($1, length(SP)+1) ~ /^[0-9]{3}/)

答案2

您可以告诉 awk 读取以精确字符开头的正则表达式,然后使用方括号中的字符“类型”,后跟大括号中的重复编号。就像这样:

echo "ABC956" |  awk '{ if( $1 ~ /^ABC[0-9]{3}/) print "HELLOWORLD" }'                                 
HELLOWORLD

您也可以使用逻辑运算符&&来测试变量和正则表达式是否存在

echo "ABC956" |  awk -v VAR="ABC" '{ if( $1 ~ VAR && $1 ~ /[0-9]{3}/) print "HELLOWORLD" }'            
HELLOWORLD

相关内容