
¿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 -n
opción sed
no 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 :1
si 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 sed
versiones.
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 g
bandera 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 \t
no funcionará en todos sed
los estilos, así como +
para "uno o más" debe reemplazarse por\{1,\}