shell脚本只打印alpha数字字符串,忽略所有整数



我是linux脚本的新手。对于下面的例子,我需要按照"-"分割字符串。并将输出作为单独的元素存储在数组中。稍后,我需要验证数组中的每个元素是否是整数或字母数字。如果它是整数,我需要忽略该元素,只打印非整数元素。下面的脚本,我正在尝试没有给出预期的输出,应该像'grub2-systemd-sleep-plugin'。

item = grub2-systemd-sleep-plugin-2.02-153.1
IFS='-'
read -rasplitIFS<<< "$item"
for word in "${splitIFS[@]}"; do echo $word; done

在这里尝试一下…这取决于您的数字是如何定义的,但我相信您可以使用类似于这样的东西来从输出中删除数字。我不确定是否有更有效的方法来实现这一点

for word in ${splitIFS[@]}
do 
c=$(echo $word | grep -c -E "^[0-9]+.{0,}[0-9]+$")
[ $c -eq 0 ] && echo $word
done

如果您使用的是bash,那么使用内置工具而不是子shell会更快。

line=grub2-systemd-sleep-plugin-2.02-153.1-foo-1
while [[ -n "$line" ]]
do if [[ "$line" =~ ^[0-9.]+- ]]
then line="${line#*-}"
elif [[ "$line" =~ ^[0-9.]+$ ]]
then break
elif [[ "$line" =~ ^([[:alnum:]]+)- ]]
then echo "${BASH_REMATCH[1]}";
line="${line#*-}"
elif [[ "$line" =~ ^([[:alnum:]]+)$ ]]
then echo "${BASH_REMATCH[1]}";
break
else echo "How did I get here?"
fi
done

或者

shopt -s extglob
line=grub2-systemd-sleep-plugin-2.02-153.1-foo-1
while [[ -n "$line" ]]
do case "$line" in
+([0-9.])-*)      line="${line#*-}"  ;;
+([0-9.]))        break              ;;
+([[:alnum:]])-*) echo "${line%%-*}"
line="${line#*-}"  ;;
+([[:alnum:]]))   echo "$line"
break              ;;
*)                echo "How did I get here?" ;;
esac
done

最新更新