我是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