如何在 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]=";")
所以我知道我可以在读取语句中使用单个 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]=";")