paulo1205
(usa Ubuntu)
Enviado em 13/01/2019 - 00:30h
Várias maneiras.
A mais portável possivelmente seria a seguinte (mostrada lendo de um arquivo e lendo de uma pipeline):
grep "^${variavel}:.*" arquivo | cut -d, -f1
comando_gerador_do_texto | grep "^${variavel}:.*" arquivo | cut -d, -f1
Mas isso tem a desvantagem de usar dois comandos em vez de apenas um.
As duas próximas usam apenas um comando, mas usam recursos das versões GNU do
sed e do
grep , que podem não estar universalmente disponíveis em sistemas que não usem as versões GNU desses programas.
sed -n "s/^\(${variavel}:[^,]*\).*/\1/;T;p" arquivo
comando_reador_do_texto | sed -n "s/^\(${variavel}:[^,]*\).*/\1/;T;p"
grep -o "^${variavel}:[^,]*" arquivo
comando_gerador_do_texto | grep -o "^${variavel}:[^,]*"
Como você falou em usar
awk , eis uma solução com ele (as barras invertidas antes dos sinais "
$ " são para passar o sinal para o próprio
awk , em vez de deixá-los ser interpretados pelo
shell ).
awk -F, "\$1 ~ /^${variavel}:[^,]*/ { print \$1 }" arquivo
comando_gerador_do_texto | awk -F, "\$1 ~ /^${variavel}:[^,]*/ { print \$1 }"
Todas as soluções acima têm o problema de que o valor de
variavel não pode incluir caracteres que possam afetar a sintaxe de comando invocado (por exemplo, se o valor da variável contiver o caráter "
/ ", que é usado como delimitador das expressões regulares, todos os comandos acima vão para o vinagre). Se você precisar de tais caracteres, terá de dar um jeito de escapá-los antes de os submeter aos comandos externos.
O seguinte comando usa a função
quotemeta () do Perl para tratar de modo seguro o valor da sua variável.
perl -ne 'BEGIN { $v=quotemeta(shift(@ARGV)); } chomp(); /^($v:[^,]*)/ && print "$1\n";' "$variavel" arquivo
comando_gerador_do_texto | perl -ne 'BEGIN { $v=quotemeta(shift(@ARGV)); } chomp(); /^($v:[^,]*)/ && print "$1\n";' "$variavel"
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)