Bash

使用帶有 IFS 變數的正則表達式來拆分 Bash 字元串

  • June 29, 2020

我正在嘗試通過任何字母數字字元將字元串拆分為數組。可以將正則表達式模式分配給 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")

引用自:https://unix.stackexchange.com/questions/595602