Soy un novato en Bash y tuve dificultades sobre cómo obtener la cadena específica en mi archivo a continuación:
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
Con este archivo que he indicado anteriormente, quiero obtener todos estos datos/valores siguientes:
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
(los que están al lado de NE*823*2*SC*q345w45*DT*RTD por ejemplo). ¡Gracias!
Respuesta1
Como los valores que le interesan parecen estar divididos en varias líneas, confiaría en una expresión regular de Perl pura para que coincida con los patrones correctos:
cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'
Nota: He asumido que los valores que estás buscando terminan con este delimitador:
XXX**TP
donde XXX
podría estar RSS
o SNA
en tu ejemplo.
Cómo funciona
join("", <>)
está creando una sola cadena a partir del resultado delcat
comandoque uso para analizar (el
=~
operador) usando esta expresión regular:/\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm
Esta expresión regular busca cadenas que comiencen con una estrella
\*
y estén formadas por caracteres [A-Za-z0-9_] (el acceso directo es\w
para palabras) y espacios\s
, un posible~
(0 o 1 vez) y luego 3 caracteres de palabra (por ejemplo:RSS
oSNA
) dos estrellas\*\*
seguidas deTP
.Los paréntesis se utilizan para capturar sólo el patrón encerrado entre ellos.
/gm
son modificadores de expresiones regulares queg
devolverán todas las cadenas coincidentes (no solo la primera) ym
permiten búsquedas de varias líneas.La
for
declaración recorre todos los resultados y solicita cada coincidencia encontradas/\s//g && print "$_\n"
.s/\s//g
elimina todos los espacios (incluidos los retornos de carro) yprint "$_\n"
genera el resultado final ($_
siendo el valor actual de en el bucle for)
Me da los valores esperados (sin codificarlos en el comando):
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
Actualizar: (para incluir el patrón de fechas)
Utilice el siguiente comando ahora:
cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'
Respuesta2
Puede utilizar cat
para mostrar el archivo y grep
obtener solo líneas con los valores que desee.
p.ej:cat myfile | grep 7530SRTRJTROIT
o para obtener múltiples valores, puede usar egrep
lo que permite expresiones regulares:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile