Bash 中字符串中的子字符串?

Bash 中字符串中的子字符串?

在 Bash 中,python 语句的等价语句是什么:

if "mystr" in "a long string with mystring in it":
    print("found string")

字符数的偏移量不能依赖于恒定,因此我认为我无法开始cut工作。

答案1

使用通配符匹配。对于 bash 来说:

if [[ $longstring == *mystr* ]]; then

if [[ $longstring == *"my string"* ]]; then

if [[ $longstring == *"$matchstr"* ]]; then

[[运算符中,左侧按字面意思进行扩展(即不需要双引号),而右侧未加引号的部分则被视为通配符 - 基本上与语句中的引用规则相同case

也可以使用 POSIX 正则表达式匹配:

if [[ $longstring =~ mystr ]]; then

if [[ $longstring =~ "my string" ]]; then

if [[ $longstring =~ "$matchstr" ]]; then

再次,右侧的引号部分按字面意思匹配,而未引号的部分则作为正则表达式运算符匹配。


如果您需要兼容性:

case $longstring in
    *mystr*)
        echo yes;;
    *"$matchstr"*)
        echo yes again!;;
    *)
        echo no;;
esac

或者,如果你想滥用语言:

if case $longstring in
    *mystr*) true;;
    *"$matchstr"*) true;;
    *) false;;
esac; then
    ...
fi

(这种 if/case/esac/then 形式实际上在某些情况下很有用,例如在制作增量白名单/黑名单时。)

简短版本:

if ! case $longstring in *"$matchstr"*) !; esac; then
    echo "It matched!"
fi

很多 sh 脚本使用expr但它不是 shell 内置的,因此速度有点慢:

if expr match "$longstring" ".*mystr"; then
    ...
fi

在这种情况下(因为 expr 无法看出引用的差异),整个“match”参数被解释为锚定正则表达式(类似于 grep,但始终带有前缀^)。因此,在将变量作为匹配传递时要小心。

答案2

这将做到这一点:

#! /bin/bash

X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
        echo "found string";
fi

这里的想法是“echo”设置字符串,grep 在传递给它的字符串中查找子字符串,然后 wc -l 返回找到该字符串的行数 - 因此是 0 或 1。

答案3

您可以使用bash参数扩展:

if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi

或者如果你想要一个与 Bourne 兼容的表达式:

if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi

$SearchString可以是文字:它可以包含空格,无论是文字还是变量,变量可以包含},但在文字中必须将其转义为\}。在第一种形式中,同样的考虑也适用于/

相关内容