Regex 如何让Bash3.2在通配符之间找到模式

Regex 如何让Bash3.2在通配符之间找到模式,regex,arrays,bash,expression,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 =~运算符处理正则表达式,因此要

试图将输入与包含警告词的文件进行比较

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

=~
运算符处理正则表达式,因此要进行通配符匹配,语法如下所示:

if [[ $MYINPUT =~ .*$X.* ]]
但是,由于这是正则表达式,因此不需要它,因为这意味着它可以位于字符串中的任何位置(除非使用
^
和/或
$
锚定它),因此这就足够了:

if [[ $MYINPUT =~ $X ]]

请注意,如果您的“单词”碰巧包含regex元字符,那么这可能会发生奇怪的事情。

操作符处理正则表达式,因此要进行您想要的通配符匹配,语法如下所示:

if [[ $MYINPUT =~ .*$X.* ]]
但是,由于这是正则表达式,因此不需要它,因为这意味着它可以位于字符串中的任何位置(除非使用
^
和/或
$
锚定它),因此这就足够了:

if [[ $MYINPUT =~ $X ]]

请注意,如果您的“单词”碰巧包含regex元字符,那么这可能会产生奇怪的结果。

我在这里避免使用
=~
,因为正如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
readmyinput

alertWords=($(我在这里避免
=~
,因为正如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
readmyinput

alertWords=($(如果要使用模式而不是正则表达式进行匹配,可以使用
大小写

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

如果要使用模式而不是正则表达式进行匹配,可以使用
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