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