¿Cómo puedo extraer una cadena específica en Linux?

¿Cómo puedo extraer una cadena específica en Linux?

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**TPdonde XXXpodría estar RSSo SNAen tu ejemplo.

Cómo funciona

  • join("", <>)está creando una sola cadena a partir del resultado del catcomando
  • que 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 \wpara palabras) y espacios \s, un posible ~(0 o 1 vez) y luego 3 caracteres de palabra (por ejemplo: RSSo SNA) dos estrellas \*\*seguidas de TP.

    Los paréntesis se utilizan para capturar sólo el patrón encerrado entre ellos.

    /gmson modificadores de expresiones regulares que gdevolverán todas las cadenas coincidentes (no solo la primera) y mpermiten búsquedas de varias líneas.

  • La fordeclaración recorre todos los resultados y solicita cada coincidencia encontrada s/\s//g && print "$_\n".

    s/\s//gelimina todos los espacios (incluidos los retornos de carro) y print "$_\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 catpara mostrar el archivo y grepobtener solo líneas con los valores que desee.

p.ej:cat myfile | grep 7530SRTRJTROIT

o para obtener múltiples valores, puede usar egreplo que permite expresiones regulares:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile

información relacionada