bash glob 的优化

bash glob 的优化

寻找在 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 的文件,每行一个(例如)。

有关的:为什么使用 shell 循环处理文本被认为是不好的做法?

相关内容