【问题标题】:How to use two `IFS` in Bash如何在 Bash 中使用两个“IFS”
【发布时间】:2022-01-24 21:10:39
【问题描述】:

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

variable = 5 + 1;
print variable;

我有代码将每个单词拆分分配给一个数组,但我也想在; 以及一个空格处拆分,如果它出现的话。

这是目前为止的代码

INPUT="$1"

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]=";")

【问题讨论】:

  • 使用IFS=' ;'?
  • 这确实删除了单词末尾的;,但它并没有将它们保留在数组中,它只是删除了它们,这是我不想要的。
  • 您在问题中写道“我也想在 ; 以及空格处分割”。
  • 使用 GNU sed 的解决方法:read -r -a raw_input &lt; &lt;(sed -z 's/;/ ;/g; s/\n/ /g' "$INPUT"); declare -p raw_input
  • @Twilight:我现在把它作为答案发布了。

标签: bash shell sh ifs


【解决方案1】:

使用 GNU sed 的解决方法。这会在每个 ; 之前插入一个空格,并用空格替换每个换行符。

read -r -a raw_input < <(sed -z 's/;/ ;/g; s/\n/ /g' "$INPUT")
declare -p raw_input

输出:

声明 -a raw_input=([0]="variable" [1]="=" [2]="5" [3]="+" [4]="1" [5]=";" [6 ]="打印" [7]="变量" [8]=";")

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多