寻找在 bash 中优化正则表达式匹配的指南。
我有一个脚本,它循环遍历一长串 URL 来查找模式。目前它看起来有点像下面的片段。有优化此类匹配的指南吗?
if [[ ${url} == */oai/request ]]
then
echo first option
elif [[ ${url} =~ .*/index.php/[^/]+/journal=.* ]]
then
echo second option
elif [[ ${url} =~ .*/[Ee][Tt][dD]-[Dd][Bb]/.* ]]
then
echo third option
elif [[ ${url} =~ .*/handle/[0-9]+/[0-9].* || ${url} =~ .*/browse.* ]]
then
echo fourth option
else
echo no-match option
fi
答案1
正如评论中指出的那样,类似的事情awk
可能比尝试在 shell 中执行此操作更适合:
/\/oai\/request/ { print "first option" ; next }
/\/index\.php\/[^/]+\/journal=/ { print "second option"; next }
/\/[Ee][Tt][dD]-[Dd][Bb]\// { print "third option" ; next }
/\/handle\/[0-9]+\/[0-9]/ || /\/browse/ { print "fourth option"; next }
{ print "no match" }
然后:
$ awk -f script.awk inputfile
其中inputfile
是包含 URL 的文件,每行一个(例如)。