巴斯:一切都没有削减?如果声明(字符串比较)

时间:2013-10-20 23:12:49

标签: bash

我正在尝试匹配以/John/开头但在/之后不包含/John/的任何字符串

if

  [ $string == /John/[!/]+ ]; then  ....

fi

这就是我得到的,似乎没有用。

所以我试过

if

  [[ $string =~ ^/John/[!/]+$ ]]; then  ....

fi

它仍然无效,因此我将其更改为

if

  [[ $string =~ /John/[^/] ]]; then  ....

fi

虽然有效,但也会匹配/后面/John/所有字符串。

4 个答案:

答案 0 :(得分:0)

对于bash,你想要[[ $string =~ /John/[^/]*$ ]] - 行结束锚点确保在最后一个可接受的斜杠之后没有斜杠。

答案 1 :(得分:0)

“字符串以'/ John /'开头并且在'/ John /'之后不包含任何斜杠怎么样?”

[[ $string = /John/* && $string != /John/*/* ]]

或者您可以与仅在满足条件时展开的参数扩展进行比较。这说“在剥去一切之后,包括在最后一次斜线后,字符串是/ John”:

[[ ${string%/*} = /John ]]

事实上,最后一个解决方案是我唯一可以提出的POSIXLY_STRICT解决方案,没有多个test表达式。

[ "${string%/*}" = /John ]

顺便说一下,你的问题可能只是在单括号test表达式中使用双等号。 bash实际上确实在 double -bracket测试表达式中接受它们,但是单个等于是一个更好的主意。

答案 2 :(得分:0)

您也可以使用普通的旧grep:

string='/John Lennon/Yoko Ono'
if echo "$string" | grep -q "/John[^/]" ; then
    echo "matched"
else
    echo "no match found"
fi

只有当/ John位于字符串的最后时才会失败...如果有可能那么你可以调整来处理这种情况,例如:

string='/John Lennon/Yoko Ono'
if echo "$string" | grep -qP "(/John[^/])|(/John$)" ; then
    echo "matched"
else
    echo "no match found"
fi

答案 3 :(得分:-1)

不确定您使用的是哪种语言,但正常的否定字符类前缀为^

e.g。

[^/]

您还可以输入开始/结束限定符(clojure示例,因此Java的正则表达式引擎)。通常在开始时为^,在结束时为$。

user => (re-matches #"^/[a-zA-Z]+[^/]$" "/John/")
nil