我正在编写一个脚本,该脚本使用正则表达式进行grepping,并包含另一个带变量的正则表达式。但它似乎存在问题。
脚本($ hostname是来自命令行的参数,可以是google.com):
tldlist="$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | grep -v '#' | tr '\n' '|' | sed 's/|$//g')"
curl="$(curl -vfIk https://$hostname 2>&1 | sed 's/^\* \t //g' | grep -i -o --color=never -E \"CN=\(.*\)\.\($tldlist\)\")"
expiration="`curl -vfIk https://$hostname 2>&1 | sed 's/^\* \t //g' | grep -i -E --color=never '(start|expire)'`"
echo "$curl"
echo "$expiration"
它与curl输出中具有公用名的部分不匹配。 如果我手动编写正则表达式,它可以正常工作并匹配。
所以问题是:如何在bash中解决这个正则表达式问题?
更新
现在我尝试用另一种方式编写它,它的工作原理(基本上):
curl=$(curl -vfIk https://$hostname 2>&1 | sed 's/^\* \t //g' | grep -i -o --color=never -E "CN=(.*)\.($tldlist)")
问题在于转义引号和括号。但由于多行变量,我必须将命令的输出放入双引号中(不是上面的行,这只是给你一行)。
但仍然:
如何解决转义/正则表达式/变量问题存在问题。
答案 0 :(得分:0)
直接问题不是正则表达式问题。您的$tldlist
变量在单引号内,单引号可防止变量扩展。将第二行更改为,例如:
curl="$(curl -vfIk https://$hostname 2>&1 | sed 's/^\* \t //g' | tr '[A-Z]' '[a-z]' | grep -i --color=never -E "CN=\(.*\)\.$tldlist")"
以便$tldlist
展开。