对于如何通过给定分隔符在Bash脚本中拆分字符串,很少questions有很好的答案。
我的问题是我得到的文件中有空格分隔的字符串,可能被引用,例如
foo bar "foo bar baz" baz
我喜欢4个值foo
,bar
,foo bar baz
和baz
。
如何通过尊重引号将这些输入拆分为Bash数组?
答案 0 :(得分:4)
<xpath expr="//form[@name='res.partner.form']" position="attributes">
<attribute name="invisible">True</attribute>
</xpath>
<xpath expr="//form[@id='res_partner_form']" position="attributes">
<attribute name="invisible">True</attribute>
</xpath>
shell默认情况下不提供多字符bash
分隔,但由于它是我们正在处理的文件,我们可以使用IFS
来支持FPAT定义如何处理我们正在处理的每个单词。
通常,使用
GNU Awk
时,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
答案 1 :(得分:0)
如果它只有一个带双引号的项目,你可以使用这个sed
sed 's/ /\n/g;h;s/[^"]*"\([^"]*\).*/"\1/;s/\n/ /g;x;G;s/\([^"]*\)"\([^"]*\)\("[^"]*\)\n\(".*\)/\1\4\3/' infile
如果是一个或多个,你可以使用这个awk
awk -F'"' -vOFS='"' '{for (i=1;i<=NF;i++)if((i%2)==1){gsub(" ","\n",$i)}}1' infile