The bash
shell默认不提供多字符IFS
支持分隔,但由于它是我们正在处理的文件,因此我们可以使用GNU Awk
它支持 FPAT 来定义如何处理我们正在处理的每个单词。
从 GNU Awk 手册页中按内容定义字段 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
通常情况下,使用时FS
, gawk
将字段定义为出现在每个字段分隔符之间的记录部分。换句话说,FS
定义字段不是什么,而不是字段是什么。然而,有时您确实想根据字段是什么来定义字段,而不是根据字段不是什么来定义字段。
后一部分就是我们需要使用的时候FPAT
,为了满足您对空格分隔的字符串和双引号内的字符串的要求,我们定义了一个模式,如下所示,表示任何不是包含双引号内的空格(或)但不是双引号的内容。
FPAT = "([^[:space:]]+)|("[^"]+")"
但要将其作为字符串写入Awk
,你需要转义上面的双引号,
awk 'BEGIN{FPAT = "([^[:space:]]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++) print $i}' myFile
这将在单独的行中打印您输入的每个单词,如下所示,
foo
bar
"foo bar baz"
baz
从这里开始,存储在bash
上下文你所需要的只是过程替换和mapfile
命令,
mapfile -t newArray < <(awk 'BEGIN{FPAT = "([^[:space:]]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++) print $i}' myFile)
然后你可以将数组打印为
declare -p newArray
(或)明确打印它
for item in "${newArray[@]}"; do
printf '%s\n' "$item"
done