我应该如何获得bash 3.2来查找通配符之间的模式

时间:2012-02-22 20:44:08

标签: regex arrays bash expression

尝试将输入与包含警告字

的文件进行比较
read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
# the wildcards in my expression do not work
if [[ $MYINPUT =~ *$X* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

3 个答案:

答案 0 :(得分:2)

=~运算符处理正则表达式,因此要按照您的意愿进行通配符匹配,语法如下:

if [[ $MYINPUT =~ .*$X.* ]]

然而,因为这是正则表达式,所以不需要,因为它暗示它可以在字符串中的任何位置(除非它使用^和/或$锚定,所以这应该足够了:< / p>

if [[ $MYINPUT =~ $X ]]

请注意,如果您的“单词”恰好包含正则表达式元字符,那么这可能会做一些奇怪的事情。

答案 1 :(得分:1)

我在这里避免使用=~,因为正如FatalError指出的那样,它会将$X解释为正则表达式,这可能会导致令人惊讶的错误(特别是因为它是一个扩展的正则表达式,所以它有比标准grep语法更特殊的字符。)

相反,您可以使用==,因为bash将==的RHS视为一种通用模式:

read MYINPUT
alertWords=($(<"AlertWordList"))
for X in "${alertWords[@]}"
do
# the wildcards in my expression do work :-)
if [[ $MYINPUT == *"$X"* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

我还在alertWords作业中删除了cat的使用,因为它将文件读取保留在shell中,而不是产生另一个进程来执行它。

答案 2 :(得分:0)

如果您想使用模式而不是匹配的正则表达式,可以使用case

read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
  # the wildcards in my expression do not work
  case "$MYINPUT" in
    *$X* ) echo "#1 matched" ;;
    * ) echo  "#1 nope" ;;
  esac
done