如何在 Bash 中使用两个 `IFS`

How to use two `IFS` in Bash

所以我知道我可以在读取语句中使用单个 IFS,但是否可以使用两个。例如,如果我有文本

variable = 5 + 1;
print variable;

我有代码将每个单词拆分到一个数组,但我也想在 ; 和 space 处拆分,如果它出现的话。

这是目前的代码

INPUT=""

declare -a raw_parse
while IFS=' ' read -r -a raw_input; do
  for raw in "${raw_input[@]}"; do
    raw_parse+=("$raw")
  done
done < "$INPUT"

结果:

declare -a raw_parse=([0]="variable" [1]="=" [2]="5" [3]="+" [4]="1;" [5]="print" [6]="variable;")

我想要的:

declare -a raw_parse=([0]="variable" [1]="=" [2]="5" [3]="+" [4]="1" [5]=";" [6]="print" [7]="variable" [8]=";")

GNU sed 的解决方法。这会在每个 ; 之前插入一个 space 并用 space.

替换每个换行符
read -r -a raw_input < <(sed -z 's/;/ ;/g; s/\n/ /g' "$INPUT")
declare -p raw_input

输出:

declare -a raw_input=([0]="variable" [1]="=" [2]="5" [3]="+" [4]="1" [5]=";" [6]="print" [7]="variable" [8]=";")