Bash 字符串的一部分而不在引号中使用字符

Bash 字符串的一部分而不在引号中使用字符

所以我想从这样的字符串中获取:

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

相关内容