考虑 bash 中的以下示例变量:
PET="cat/DOG/hamster"
FOOD="soup/soup/PIZZA"
SUBJECT="MATH/physics/biology"
如何用斜杠分割这些字符串,提取全部大写的部分并将其存储在变量中?例如,我将如何DOG
取出$PET
变量并将其存储在$OPTION
变量中?
我需要一个专门在 bash 和 zsh 下工作的便携式解决方案。
您可以使用tr
删除所有非大写字符:
OPTION=$(tr -dc '[:upper:]' <<< $PET)
请注意,here-strings ( <<< $VARIABLE
) 是一个bash
-ism。在其他外壳中,您必须将echo
变量放入tr
:
OPTION=$(echo "$PET" | tr -dc '[:upper:]')
你可以试试这样的 -
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
听起来只有一部分字符串是大写的,因此您可以忽略问题的拆分部分。这应该适用于zsh
和bash
(尽管它在 POSIX 兼容性方面不可移植):
$ echo "${PET//[^A-Z]}"
DOG