所以我想从这样的字符串中获取:
q='"Something, variable", another part, third one'
“某事,可变”部分。
我可以得到
'"Something'
使用${q%%,*}
。
但是我怎样才能让 bash 忽略引号内的逗号(或其他字符)呢?
答案1
echo "${q%"${q#*\"*\"}"}"
"Something, variable"
...通过使用删除在字面解释"
中找到的第二个双引号的结果,仅适用于这两个引号$q
(阅读 - 内部引用)$q
要从 的尾部剥离的模式字符串。如果在$q
扩展中找不到两个双引号,则为 null。
另外,如果有任何字符领先其中的第一个,$q
它们也将被保留。
所以...
q='x""'
echo "${q%"${q#*\"*\"}"}"
x""
你可以这样处理:
[ -z "${q##\"*}" ] || q=\"${q#*\"}
echo "$q"
""
答案2
使用它非常简单,因为它在核心中perl
有解析器:Text::ParseWords
#!/usr/bin/env perl
use strict;
use warnings;
use Text::ParseWords;
use Data::Dumper;
my $q = '"Something, variable", another part, third one';
my @words = parse_line ( ',', 0, $q );
#dump words:
print Dumper \@words;
#just output first one:
print $words[0];
或者对其进行单行化,以便您可以在 shell 中内联使用它:
echo $q | perl -MText::ParseWords -e '@w=parse_line(',',0,<>);print $w[0]'
它将从 STDIN 读取并在 STDOUT 中打印解析的第一个“单词”。
(或者你可以通过via或类似的方式将其输入$ENV{q}
)。
答案3
您必须更改内部字段分隔符:IFS
q='"Something, variable", another part, third one'
# save actual IFS
_old_ifs="${IFS}"
# set IFS to ","
IFS=","
# split q with this new IFS
set -- `echo ${q}`
# restore standard IFS
IFS="${_old_ifs}"
echo \'$1\'
答案4
您可以通过 cut 对其进行管道传输,将双引号字符指定为字段分隔符并要求仅输出第二个字段。
$ q='"Something, variable", another part, third one'
$ echo $q | cut -d\" -f2
Something, variable