![在模式匹配中组合变量和正则表达式](https://linux22.com/image/82078/%E5%9C%A8%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E4%B8%AD%E7%BB%84%E5%90%88%E5%8F%98%E9%87%8F%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我希望在文件中搜索由 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