3

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

PET="cat/DOG/hamster"

FOOD="soup/soup/PIZZA"

SUBJECT="MATH/physics/biology"

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

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

4

3 回答 3

2

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

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

请注意,here-strings ( <<< $VARIABLE) 是一个bash-ism。在其他外壳中,您必须将echo变量放入tr

OPTION=$(echo "$PET" | tr -dc '[:upper:]')
于 2013-05-26T14:38:03.470 回答
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
于 2013-05-26T14:24:10.143 回答
2

听起来只有一部分字符串是大写的,因此您可以忽略问题的拆分部分。这应该适用于zshbash(尽管它在 POSIX 兼容性方面不可移植):

$ echo "${PET//[^A-Z]}"
DOG
于 2013-05-26T17:20:14.160 回答