bash子串正则表达式匹配通配符

时间:2013-09-10 23:47:19

标签: regex bash

我正在做bash,我尝试测试给定变量x中的子串“world”。我有部分代码工作。但另一个不工作。我想弄明白为什么

第一个正在运作

x=helloworldfirsttime
world=world
if [[ "$x"  == *$world* ]];then
    echo matching helloworld

第二个不起作用

x=helloworldfirsttime
if [[ "$x"  == "*world*" ]];then
    echo matching helloworld

如何在不使用第一种方法的变量的情况下使第二种工作

有人可以为我修复第二个..谢谢

4 个答案:

答案 0 :(得分:4)

只需删除引号:

x=helloworldfirsttime
if [[ "$x" == *world* ]]; then
    echo matching helloworld
fi

请注意,这不是正则表达式(正则表达式类似于.*world.*)。这里描述了bash中的模式匹配:
http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html

答案 1 :(得分:3)

x=helloworldfirsttime
$ if [[ "$x" == *world* ]]; then echo MATCHING; fi
MATCHING

这是有效的,因为bash的内置[[运算符将==测试的右侧视为模式:

  

当使用==!=运算符时,运算符右侧的字符串将用作模式并执行模式匹配。

答案 2 :(得分:0)

下次如果您想提供带空格的图案,您可以在""''周围引用它,只需要将图案字符放在外面:

[[ "$x"  == *"hello world"* ]]

[[ "$x"  == *'hello world'* ]]

[[ "$x"  == *"$var_value_has_spaces"* ]]

答案 3 :(得分:0)

您保留不带引号和=~运算符的使用方式。

TEXT=helloworldfirsttime
SEARCH=world
if [[ "$TEXT" =~ .*${SEARCH}.* ]]; then echo MATCHING; else echo NOT MATCHING; fi
TEXT=hellowor_ldfirsttime
if [[ "$TEXT" =~ .*${SEARCH}.* ]]; then echo MATCHING; else echo NOT MATCHING; fi