Bash
使用帶有 IFS 變數的正則表達式來拆分 Bash 字元串
我正在嘗試通過任何非字母數字字元將字元串拆分為數組。可以將正則表達式模式分配給 IFS 變數來完成此操作嗎?
我試過這樣:
input="$1" IFS="[^a-zA-Z]" read -ra name_parts <<< "$input"
但這會將字元串拆分為任何“a”或“A”——甚至無法辨識“^”。 這個問題的標題看起來很相似,但似乎與我要問的問題無關。
IFS
不能這樣使用。它不需要正則表達式。至少,組成 的字元(字面量)IFS
被 shell 用來在擴展單詞時分割單詞。例如IFS=: read -r v1 v2 <<<"foo:bar"
您在中定義的內容按
IFS="[^a-zA-Z]"
字面意思表示,即每個[
,^
,a
,-
,z
,A
,Z
並]
用作分隔符來拆分您的輸入字元串,這顯然不是您希望做的事情。
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")