Retornar texto entre

1. Retornar texto entre

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 12/01/2019 - 13:52h

.
.
Pessoas ... preciso retornar um texto de um arquivo ... padrão, começa com a variável + ':' e termina antes da próxima vírgula ... se não me engano o Marcelo uma vez postou um AWK curtinho que era mais ou menos isso.

Abçs


  


2. Re: Retornar texto entre

Paulo
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)


3. Re: Retornar texto entre

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 13/01/2019 - 12:40h

paulo1205 escreveu:
Várias maneiras.
...


Valeu pelas ideias Paulo, mas eu queria era ver se alguém postava um comando bem curto quer eu tenho certeza que existe, a princípio o que fiz foi substituir virgulas por quebras, depois eu faço a busca.

sed 's/,\ /\n/g' $ARQ | grep "$VAR:"  


Esse comando resolve minha vida em 90% pois existem ocorrências que são precedidas por uma string, aí tenho que fazer um outro sed para eliminar essa string .

sed "s,$TXT,,g" $ARQ | sed 's/,\ /\n/g' | grep "$VAR:"  



------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



4. Re: Retornar texto entre

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/01/2019 - 23:34h

Mais curto do que a versão com “grep -o”?

Se pode haver outros textos antes da string que você quer, você pode tirar o sinal “^” das expressões regulares que eu mostrei, ou trocá-lo por alguma coisa que lhe atenda. Por exemplo, a versão com “grep -o” poderia ser trocada para algo como “egrep -o "\\b$VAR:[^,]*"” (só um grep, sem necessidade de chamar também o sed), e na versão com Perl bastaria trocar o “^” por “\b”.

... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


5. Re: Retornar texto entre

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/01/2019 - 13:58h


Mauriciodez escreveu:

.
.
Pessoas ... preciso retornar um texto de um arquivo ... padrão, começa com a variável + ':' e termina antes da próxima vírgula ... se não me engano o Marcelo uma vez postou um AWK curtinho que era mais ou menos isso.
Abçs

Boa tarde,
Segue sugestão:
echo -e "ESTA_É_A_VAR:,MAIS_ALGUMA_COISA\nNAO_EH_A_VAR:,OUTRA_COISA"|awk -F":," '/ESTA_É_A_VAR/ {print $1}' 



6. Re: Retornar texto entre

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 15/01/2019 - 00:31h

.
.
.
.
Pessoas ... estou terminando umas coisas e me parece que o cenário apresentado aqui por mim vai ter que ser alterado ... vou deixar o tópico em off por enquanto.

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts