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

Car*_*los 6 awk

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

if ( $1 ~ /^[A-Z][A-Z][A-Z][0-9][0-9][0-9]/) 
Run Code Online (Sandbox Code Playgroud)

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

SP="ABC" 
if ( $1 ~ /^/SP/[0-9][0-9][0-9]/)>
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用。如何在搜索模式中组合变量和正则表达式?

Sté*_*las 7

SP="ABC" 
if ( $1 ~ "^" SP "[0-9]{3}")
Run Code Online (Sandbox Code Playgroud)

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

$1 ~ /ABC/ /BCD/
Run Code Online (Sandbox Code Playgroud)

可以被视为$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
Run Code Online (Sandbox Code Playgroud)

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


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

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