我正在尝试按任意字符将字符串拆分为数组不是字母数字。可以将正则表达式模式分配给 IFS 变量来完成此任务吗?
我已经尝试过像这样:
input="$1"
IFS="[^a-zA-Z]"
read -ra name_parts <<< "$input"
但这会将字符串分割为任何“a”或“A” - 甚至无法识别“^”。 这个问题标题看起来很相似,但似乎与我要问的问题无关。
答案1
IFS
不能这样使用。确实如此不是取一个正则表达式。至少,组成 的字符(文字)IFS
被 shell 在扩展单词时用来分割单词。例如
IFS=: read -r v1 v2 <<<"foo:bar"
您所定义的内容IFS="[^a-zA-Z]"
按字面意思接受字符,即每个、 、 、 、 、 和[
用作^
分隔a
符-
来z
分割A
您的输入字符串,这显然不是您期望做的事情。Z
]
答案2
IFS
只是一堆字符(或字节),而不是正则表达式。但是您可以使用 awk 或 sed 根据正则表达式分割字符串,使用更简单的分隔符打印出来,然后使用 shell 的read
.
read -ra name_parts < <(awk -vFS='[^a-zA-Z]' -vOFS=' ' '{$1=$1; print}' <<< "$input")
或者
read -ra name_parts < <(sed -e 's/[^a-zA-Z]/ /g' <<< "$input")
答案3
IFS
您最好映射输入字符串,然后使用默认的 IFS 拆分它,而不是修改:
read -ra name_parts <<<"$(printf '%s\n' "$input" | LC_ALL=C tr -cs 'a-zA-Z\n' '[ *]')"
现在,数组名称 _parts 将保存在非字母位置切片的字符串。