【问题标题】:KSH: search string for multiple substringsKSH:搜索多个子字符串的字符串
【发布时间】:2012-10-15 16:37:52
【问题描述】:

我有一个简单的方法可以在单个字符串中搜索多个子字符串:

if [[ $string = *"string 1"* && $string = *"string 2"* && $string = *"string 3"* ]]

(在此处搜索string 1string 2string 3 in string)。

我怎样才能简化这个,以便只有一个检查?

我试过了:

if [[ $string = *"string 1"*"string 2"*"string 3"* ]]

if [[ $string = *"string 1*string 2*string 3"* ]]

注意:此处指定的三个字符串将始终按此顺序排列,因此我可以简化它。

【问题讨论】:

    标签: string substring ksh


    【解决方案1】:

    在 ksh93 中,您可以使用 & 子模式分隔符。

    $ [[ abcdefg == @(*bcd*&*cde*&*efg*) ]]; echo $?
    0
    $ [[ abcdefg == @(*bcdz*&*cde*&*efg*) ]]; echo $?
    1
    

    不幸的是,只有 ksh93 有这个。在 mksh、zsh 和 bash 中,通过扩展匹配,否定子模式允许这种类似 DeMorgan 的等价。

    $ [[ abcdefg == !(!(*bcd*)|!(*cde*)|!(*efg*)) ]]; echo $?
    0
    $ [[ abcdefg == !(!(*bcdz*)|!(*cde*)|!(*efg*)) ]]; echo $?
    1
    

    要测试一种模式,请参阅this FAQ

    【讨论】:

    • 第二种解决方案有效,谢谢。使用我的语法(即在“if”语句中),解决方案是:if [[ $string == !(!(*"string 1"*)|!(*"string2"*)|!(*"string3"*)) ]]
    • @Wikis 您可能正在使用非常旧的 ksh,或者不是 AT&T ksh。幸运的是,!() 对于所有类似 ksh 的 shell,甚至是 ksh88,都非常可移植。
    • 我强烈怀疑前者...!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多