如何在Bash中拆分引用的字符串?

时间:2017-11-22 12:00:40

标签: bash awk split

对于如何通过给定分隔符在Bash脚本中拆分字符串,很少questions有很好的答案。

我的问题是我得到的文件中有空格分隔的字符串,可能被引用,例如

foo bar "foo bar baz" baz

我喜欢4个值foobarfoo bar bazbaz

如何通过尊重引号将这些输入拆分为Bash数组?

2 个答案:

答案 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定义如何处理我们正在处理的每个单词。

来自Defining Fields by Content

下的GNU Awk手册页
  

通常,使用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