分割字符串并选择大写子字符串

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

PET="cat/DOG/hamster"

FOOD="soup/soup/PIZZA"

SUBJECT="MATH/physics/biology"

如何通过斜杠分隔这些字符串,提取所有大写部分并将其存储在变量中?例如,如何从 $PET 变量中取出 DOG 并将其存储在 $OPTION 变量中?我需要一个可在bash和zsh下运行的便携式解决方案。
3个回答

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?后者在我的系统上似乎不是一个有效的命令。另外,尝试使用 echo $OPTION 命令输出时似乎没有任何输出。 - fabiomaia
1
@faviouz 这不应该有影响。gawkawkgnu 扩展。它有一些很棒的功能,但不应该对上面的答案产生影响。 - jaypal singh
2
@Jaypal,是的,\< 是GNU特有的。 - Stephane Chazelas
@sch 很好的发现。如果我们使用 [[:<:]][[:>:]] 应该可以工作。 - jaypal singh

2
您可以使用tr删除所有非大写字母的字符:
OPTION=$(tr -dc '[:upper:]' <<< $PET)

请注意,Here-strings<<< $VARIABLE)是一种特定于bash的语法。在其他Shell中,您需要通过echo将变量传递给tr命令进行转换:
OPTION=$(echo "$PET" | tr -dc '[:upper:]')

1
将无法处理标题大小写的单词。例如:PET='猫/狗/安格斯' - jaypal singh
1
是的。然而,从OP提供的例子来看,这似乎不是一个问题。 - Ansgar Wiechers
感谢您的输入。确实,在标题大小写方面没有问题,解决方案似乎有效。 - fabiomaia
我应该指出,在旧的 Bourne shell (sh) 中,这种方法不起作用。我使用 OPTION=$(echo $PET | tr -dc '[:upper:]') 使其正常工作。 - fabiomaia
2
没错,因为它们不支持HERE-STRING符号。那只有bash可以。 - jaypal singh

2

听起来只有字符串的一部分是大写的,因此您可以忽略问题的分割部分。这应该适用于zshbash(虽然从POSIX兼容性的意义上讲不具备可移植性):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接