我正在尝试解析一个 sudoers 文件,该文件包含它自己的正则表达式版本,但无法获得有效且一致的结果。我需要能够将一个变量与另一个包含正则表达式的变量进行比较
Source = "padcl"
Regexp = "*dc*"
尝试的 3 个选项(=~、grep、awk)都不会产生匹配和不匹配所需的结果。
脚本示例
export VAR1="padcl"
export VAR2="*dc*"
if [[ "$VAR1" =~ "$VAR2" ]]
then
echo "$VAR1 matches $VAR2"
else
echo "$VAR1 does not match $VAR2"
fi
export VALCNT=`echo "$VAR1" |egrep -E "${VAR2}" |wc -l`
if (( $VALCNT > 0 ))
then
echo "$VAR1 grep matches $VAR2"
else
echo "$VAR1 does not grep match $VAR2"
fi
export VALCNT2=`echo "$VAR1" |awk -vparm=${VAR2} '$1 ~ parm {print $0}' |wc -l`
if (( $VALCNT2 > 0 ))
then
echo "$VAR1 awk matches $VAR2"
else
echo "$VAR1 does not awk match $VAR2"
fi
输出 - 运行 1(应该匹配)
padcl does not match *dc*
padcl grep matches *dc*
padcl does not awk match *dc*
输出 - 运行 2(不应匹配)
padcl does not match *dx*
padcl grep matches *dx*
padcl does not awk match *dx*
现在我已经编码 20 多年了,我知道 regexp 标准。在不编写自己的正则表达式解析器的情况下,如何使标准下降到 sudoers 支持的更差的正则表达式标准?
解决方案:我发现我可以使用以下命令预解析“ dc ”变量
export PARM=`echo "$VAR2"| sed 's/\*/\.\*/g'`
这会强制正则表达式查找 1 个或多个字符,而不是 * 指定的 0 个或多个字符。