【问题标题】:Split a string and pick the uppercase substring拆分字符串并选择大写子字符串
【发布时间】:2013-05-21 12:43:09
【问题描述】:

考虑以下 bash 中的示例变量:

PET="cat/DOG/hamster"

FOOD="soup/soup/PIZZA"

SUBJECT="MATH/physics/biology"

如何用斜杠分割这些字符串,提取全部大写的部分并将其存储在变量中?例如,我如何将DOG$PET 变量中取出并将其存储在$OPTION 变量中?

我需要一个专门在 bash 和 zsh 下工作的便携式解决方案。

【问题讨论】:

    标签: string bash split zsh uppercase


    【解决方案1】:

    您可以使用tr 删除所有非大写字符:

    OPTION=$(tr -dc '[:upper:]' <<< $PET)
    

    注意here-strings (&lt;&lt;&lt; $VARIABLE) 是bash-ism。在其他 shell 中,您必须将 echo 变量转换为 tr

    OPTION=$(echo "$PET" | tr -dc '[:upper:]')
    

    【讨论】:

    • 在标题大小写中的单词将失败。例如PET='Cat/DOG/Angus'
    • 是的。但是,从 OP 提供的示例来看,这似乎不是问题。
    • 感谢您的意见。实际上,标题大小写中的单词在这里不是问题,并且该解决方案似乎有效。
    • 我应该指出,这在旧的 Bourne shell (sh) 中不起作用。我使用OPTION=$(echo $PET | tr -dc '[:upper:]') 让它工作。
    • 正确,因为他们不支持 HERE-STRING 表示法。那只是 bash。
    【解决方案2】:

    你可以试试这样的 -

    OPTION=$(gawk -F'/' '{for (i=1;i<=NF;i++) if ($i ~ /\<[A-Z]+\>/) print $i}' <<< $PET)
    

    如果您喜欢纯 bash 解决方案,那么您可以添加以下代码

    #!/bin/bash
    
    PET="cat/DOG/hamster"
    IFSBK=$IFS
    IFS='/'
    for word in $PET; do
        if [[ $word =~ [A-Z]+ ]]; then
            OPTION="$word"
        fi
    done
    IFS=$IFSBK
    

    【讨论】:

    • 感谢您的意见。您的意思是输入awk 而不是gawk?后者似乎不是我系统上的有效命令。此外,在尝试回显 $OPTION 时,它似乎没有输出任何内容。
    • @faviouz 没关系。 gawkawkgnu extension。它有一些简洁的功能,但不会影响上述答案。
    • @Jaypal,是的 \&lt; 是 GNU 特定的
    • @sch 不错。如果我们使用[[:&lt;:]][[:&gt;:]],它应该可以工作
    【解决方案3】:

    听起来只有一部分字符串是大写的,所以你可以忽略问题的分割部分。这应该在zshbash 中都可以使用(尽管从POSIX 兼容性的角度来看它是不可移植的):

    $ echo "${PET//[^A-Z]}"
    DOG
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2014-08-01
      • 1970-01-01
      • 2011-11-25
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多