Sou novato em Bash e tive dificuldade em como vou conseguir a string específica no meu arquivo abaixo:
DS*SC*S45WG*X56558*2
NE*823*2*SC*q345w45*DT*RTD*7530SRT
RJTROIT**20140617
SNA**TP*55
DS*SC*S45WG*X56558*2
NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
RSS**TP*55
DS*SC*S45WG*X56558*2
NE*18*1*SC*3435*DT*PR*753SLRT
JSRT**20140617~RSS**TP*55
DS*SC*S45WG*X56558*1
NE*19*1*SC*ERS*DT*DFS*753048SRY
TSERY4654**20140617~RSS**TP*60
DS*SC*S45WG*X56558*1
NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
RSS**TP*140
DS*SC*S45WG*X56558*1
NE*73*46464
SD**15769
SNA*PUI*000015769
Com este arquivo que afirmei acima, desejo obter todos os seguintes dados/valores:
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
(aqueles próximos a NE*823*2*SC*q345w45*DT*RTD por exemplo). Obrigado!
Responder1
Como os valores nos quais você está interessado parecem estar divididos em várias linhas, eu confiaria em um regexp perl puro para corresponder aos padrões corretos:
cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'
Observação: presumi que os valores que você está procurando terminam com este delimitador:
XXX**TP
onde XXX
poderia estar RSS
ou SNA
no seu exemplo.
Como funciona
join("", <>)
está criando uma única string a partir do resultado docat
comandoque uso para analisar (o
=~
operador) usando esta expressão regular:/\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm
Este regexp procura strings começando com uma estrela
\*
e compostas de [A-Za-z0-9_] caracteres (o atalho é\w
para palavras) e espaços\s
, um possível~
(0 ou 1 vez) e depois 3 caracteres de palavra (por exemplo:RSS
ouSNA
) dois estrelas\*\*
seguidas porTP
.Parênteses são usados para capturar apenas o padrão entre eles.
/gm
são modificadores regexp ondeg
retornarão todas as strings correspondentes (não apenas a primeira) em
permitirão pesquisas multilinhas.A
for
instrução percorre todos os resultados e chama cada correspondência encontradas/\s//g && print "$_\n"
.s/\s//g
remove todos os espaços (incluindo retornos de carro) eprint "$_\n"
gera o resultado final ($_
sendo o valor atual no loop for)
Isso me dá os valores esperados (sem codificá-los no comando):
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
Atualizar: (para incluir o padrão de data)
Por favor, use o seguinte comando agora:
cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'
Responder2
Você pode usar cat
para exibir o arquivo e grep
obter apenas linhas com os valores desejados.
por exemplo:cat myfile | grep 7530SRTRJTROIT
ou para obter vários valores, você pode usar egrep
o que permite expressões regulares:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile