Bash parte da string sem usar chars entre aspas

1

Então eu quero pegar uma string como:

q='"Something, variable", another part, third one'

A parte "Algo, variável".

Eu poderia conseguir

'"Something'

usando ${q%%,*} .

Mas como eu poderia deixar o bash ignorar vírgulas (ou outros caracteres) entre aspas?

    
por kees broeksma 22.12.2015 / 20:12

4 respostas

0

Isso é bem simples usando perl se ele tiver o Text::ParseWords parser no core:

#!/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];

Ou para um-liner-ify para que você possa usá-lo no shell:

echo $q | perl -MText::ParseWords -e '@w=parse_line(',',0,<>);print $w[0]'

Que irá lê-lo a partir de STDIN e imprimir a primeira palavra 'analisada' em STDOUT.

(Ou você pode alimentá-lo via $ENV{q} ou similar).

    
por 22.12.2015 / 23:20
1
echo "${q%"${q#*\"*\"}"}"
"Something, variable"

... funciona apenas para essas duas citações usando o resultado de remover até o segundo " aspas duplas encontrado em $q como as literalmente interpretadas (read-inner-quoted) string padrão para retirar da cauda de $q . Se duaspas duplas não puderem ser encontradas em $q , a expansão será nula.

Além disso, se houvesse algum personagem liderando o primeiro deles em $q , eles também seriam retidos também.

então ...

q='x""'
echo "${q%"${q#*\"*\"}"}"
x""

Você pode lidar com isso como:

[ -z "${q##\"*}" ] || q=\"${q#*\"}
echo "$q"
""
    
por 22.12.2015 / 23:51
0

Você terá que mudar o separador de campo interno: 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\'
    
por 22.12.2015 / 23:37
0

Você pode canalizá-lo pelo corte, especificando o caractere de aspas duplas como um delimitador de campo e solicitando que apenas o segundo campo seja emitido.

$ q='"Something, variable", another part, third one'

$ echo $q | cut -d\" -f2
Something, variable
    
por 25.03.2016 / 16:33

Tags