
quero pesquisar string e preciso de parte da string
arquivo.txt:
CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE, NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKADSRATIO
ao usar sed
o comando abaixo obtendo valor extra
Saída:
bash-4.3$ sed -n 's/.*$$ENV$$_//p' file.txt
**TEMP_ESM.EMPASGMTAMPTMPRTRSE** ,NO FALLBACK ,
Eu preciso apenasTEMP_ESM.EMPASGMTAMPTMPRTRSE
Responder1
sed -n 's/.*$$ENV$$_//p' example.txt
O comando s/pattern/replacement/
de sed
pesquisa em todas as linhas a ocorrência da expressão regular pattern
e a substitui. Com a substituição vazia, o padrão é excluído, o que parece ser o que você deseja.
O final p
gera a linha modificada, enquanto toda a saída padrão é suprimida pela -n
opção.
Responder2
Com GNU grep
quando construído com suporte PCRE (recente) (como é comum em sistemas GNU e BSD):
grep -Po '\Q$$ENV$$_\E\K[^\s,]+' < file
extrairia todas as sequências de caracteres, exceto espaços em branco e vírgula, que seguem cada ocorrência de $$ENV$$_
.
Se o GNU grep
não estiver disponível, o mesmo pode ser feito com perl
(o P
no PCRE):
perl -lne 'print for /\$\$ENV\$\$_\K[^\s,]+/g' < file
Ou se a perl
versão for muito antiga para suportar \K
:
perl -lne 'print for /\$\$ENV\$\$_([^\s,]+)/g' < file
Responder3
sed
abordagem:
sed -n 's/^CREATE.*$_\([^[:space:],]*\).*/\1/p' file
\([^[:space:],]*\)
- o primeiro grupo capturado contendo caracteres, exceto espaços em branco[:space:]
e vírgula,
A saída:
TEMP_ESM.EMPASGMTAMPTMPRTRSE
Responder4
sed '/.*$$ENV$$_/!d;s///;s/,.*//'
/.*$$ENV$$_/!d
: Se a linha não contiver$$ENV$$_
, nenhuma saída, nenhum processamento adicionals///
: remova o padrão correspondentes/,.*//
: remova a vírgula e tudo depois