如何匹配被空格包围的字符串中的确切单词?
How can I match an exact word within a string that is surrounded by whitespaces?
我正在尝试根据一组允许的命令使用正则表达式匹配特定命令。
这是我想要达到的结果:
foo --happy-cat run meow # valid command
foo --happy-cat test meow # valid command
foo --happy-cat run-away woof # invalid command
这是我尝试过的
case $* in
(*run* | *test* | *build*) echo yes ;;
*) echo no ;;
esac
什么不起作用
我的比赛将 run-away
错误地匹配为有效命令。我只想匹配 run
、test
或 build
被空格
包围
您必须像这样匹配给定单词周围的空格:
case "$*" in
*" run "*|*" test "*|*" build "*) echo yes ;;
*) echo no ;;
esac
这也被称为 glob 匹配而不是正则表达式。
上面的脚本将匹配 " run "
并打印 yes
,但是对于 run-away
它将不匹配第一组 glob 并将打印 no
.
要添加到 anubhava 的回答中,如果您想使用实际的正则表达式,您可以这样做:
s='foo --happy-cat run-away woof' # test string
regex='\s+((run)|(test)|(build))\s+'
if [[ $s =~ $regex ]]
then
echo "yes"
else
echo "no"
fi
这具有匹配白色 space 的优点,它不仅 space,还匹配制表符。
我正在尝试根据一组允许的命令使用正则表达式匹配特定命令。
这是我想要达到的结果:
foo --happy-cat run meow # valid command
foo --happy-cat test meow # valid command
foo --happy-cat run-away woof # invalid command
这是我尝试过的
case $* in
(*run* | *test* | *build*) echo yes ;;
*) echo no ;;
esac
什么不起作用
我的比赛将 run-away
错误地匹配为有效命令。我只想匹配 run
、test
或 build
被空格
您必须像这样匹配给定单词周围的空格:
case "$*" in
*" run "*|*" test "*|*" build "*) echo yes ;;
*) echo no ;;
esac
这也被称为 glob 匹配而不是正则表达式。
上面的脚本将匹配 " run "
并打印 yes
,但是对于 run-away
它将不匹配第一组 glob 并将打印 no
.
要添加到 anubhava 的回答中,如果您想使用实际的正则表达式,您可以这样做:
s='foo --happy-cat run-away woof' # test string
regex='\s+((run)|(test)|(build))\s+'
if [[ $s =~ $regex ]]
then
echo "yes"
else
echo "no"
fi
这具有匹配白色 space 的优点,它不仅 space,还匹配制表符。