comprensión del código sed para el procesamiento de textos

comprensión del código sed para el procesamiento de textos

¿Alguien podría explicarme esto debajo del código sed?

sed -n '
/Policy Name:/! d
    s/.*:\s\+//
    h
    :1
    n
    /Active:\s*no/d
    /HW\//!b1
    :2
    s/.*\s\(\S*\)\s*/\1/
    G
    s/\n/\t/p
    n
    /^\s*$\|Include:/! b2
    '

Quiero editar para agregar información de "Tipo de política:", cuando la reemplazo con "Nombre de política:" funciona bien. Sin embargo, cuando agrego una sección como la siguiente, obviamente no funciona porque lo estoy intentando sin entenderlo.

sed -n '
/Policy Name:/! d
    s/.*:\s\+//
    h
    :1
    n
/Policy Type:/! d
    s/.*:\s\+//
    h
    :1
    n
    /Active:\s*no/d
    /HW\//!b1
    :2
    s/.*\s\(\S*\)\s*/\1/
    G
    s/\n/\t/p
    n
    /^\s*$\|Include:/! b2
    '

También tengo una solución para el código equivalente de AIX a continuación del mismo foro. Necesito entenderlo para editarlo y agregar el tipo de política.

# define constants
SPC=`echo x | tr x '\040'`
TAB=`echo x | tr x '\011'`
 NL=

# custom regex for...
s="[$SPC$TAB]";   # horizontal whitespace
S="[^$SPC$TAB]";  # non-whitespace

# POSIX compliant sed code...
sed -ne "
   /Policy Name:/!d

   s/.*:$s\{1,\}//
   h

   :1
      n
      /Active:$s*no/d
   /HW\//!b1

   :2
      s/.*$s\($S*\)$s*/\1/
      G
      s/\n/$TAB/p
      n
      /^$s*\$/d
      /Include:/d
   b2
"  yourfile

Fichero de entrada

Policy Name:       Today

  Policy Type:       Standard
  Active:              yes
  Effective date:      01/24/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  EU         NY  Cindy
                 BU         CA  Victor
                 GU         MI  Bob
  Include:
Policy Name:       Tomorrow

  Policy Type:       Oracle
  Active:              yes
  Effective date:      01/26/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  MU         LA  Martha
                 EU         CA  Sam
  Include:
Policy Name:       Yesterday

  Policy Type:       Oracle
  Active:              no
  Effective date:      01/21/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  NV         IL  Joe

  Include:`

Salida deseada

Cindy    Today     Standard
Victor   Today     Standard
Bob      Today     Standard
Martha   Tomorrow  Oracle
Sam      Tomorrow  Oracle

Respuesta1

Bien, hagámoslo paso a paso:

sed -n '

La -nopción sedno genera nada a menos que se indique lo contrario.

/Policy Name:/! d

Todas las líneas que no contienen Policy name:se eliminan. El resto del script sólo se procesa en los siguientes bucles.

s/.*:\s\+//
h

Esto elimina todo hasta los :espacios finales y y coloca el resto en el búfer de retención para su uso posterior.

:1
n

Este es el comienzo de un bucle que lee nuevas líneas.

/Active:\s*no/d

Las líneas con ese patrón se eliminan, por lo que obviamente no hay interés en los inactivos.

/HW\//!b1

Y ahora, hacemos un bucle :1si la línea no contieneHW/

:2
s/.*\s\(\S*\)\s*/\1/

Al comienzo del siguiente ciclo, elimine todo menos la última secuencia de no espacios en blanco.

G
s/\n/\t/p

Luego agregue el nombre de la política guardado en el búfer de retención, separado por una pestaña e imprima esa línea

n
/^\s*$\|Include:/! b2
'

y esto se repite con las siguientes líneas hasta llegar al patrón dado.

Debe tener en cuenta que este es un código altamente no portátil que no funcionará en muchas sedversiones.

Editar:Para agregar el Tipo de política como tercera columna, debe agregar esta línea al script antes o después de la Active:verificación:

/Policy Type:/{s/.*:\s*//;H;}

Es decir: si la línea contiene dicha cadena, ejecute los comandos entre {}. Esos comandos eliminan la parte hasta los :espacios en blanco finales y agregan el resto de la línea (que se supone que contiene el tipo de política) al búfer de retención. Por lo tanto, el búfer de retención contiene el nombre y el tipo de la política, separados por una nueva línea. Entonces, cuando agregamos esto con G, habrá dos nuevas líneas que serán reemplazadas, por lo que el comando de reemplazo necesita obtener la gbandera para reemplazar todas las apariciones:

s/\n/\t/gp

El script AIX es básicamente el mismo, pero evita las extensiones GNU a las expresiones regulares. Principalmente el uso de variables para hacer coincidir espacios en blanco o tabulaciones, ya que \tno funcionará en todos sedlos estilos, así como +para "uno o más" debe reemplazarse por\{1,\}

información relacionada