¿Alguien podría darme un código equivalente para el siguiente código sed? funciona bien en Linux. Sin embargo, aparece el error "sed: 0602-403 /Policy Name:/! d no es una función reconocida" cuando se ejecuta en AIX.
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
'
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
# 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
Comentarios
AIX
sed
no entiende\s
\S
como espacios en blanco o no espacios en blanco.POSIX
sed
no entiende un espacio antes de unsed
comando, en su caso/.../! d
.- También tenga en cuenta que
\+
no lo esPOSIX
. La expresión correcta para eso es:\{1,\}
o$s$s*
donde $s son átomos de expresiones regulares. \t
tampoco lo esPOSIX
. Aquí, la variable de shell$TAB
resulta útil.- El
\|
para laOR
operación ensed
esnon-POSIX
. Tenemos que dividirlo en partes y reorganizar la lógica.
Advertencia
- Puede ser que intentes
shell
hacer una expansión histórica en torno al!d
personaje. En ese caso, utilice comillas simples en esta región. Por lo demás se requieren las comillas dobles para que las$s, $S, $TAB
variables se puedan expandir. - La
$S
expresión regular coincidirá con a\n
como se muestra. Pero ese escenario nunca ocurre en su código ya que está cambiando NL -> TAB.
Respuesta2
Este es el código reelaborado para incorporar los nombres de las políticas y también para que sea compatible con POSIX. Observe que todas las referencias a \s
-> [[:space:]]
, \S
-> [^[:space:]]
, \+
->\{1,\}
PD: No estoy seguro de qué /HW\//!b1
está haciendo la línea en el original. código, sentado ahí como un appendix
, lo que sólo puede resultar doloroso si uno no tiene cuidado.
TAB=`printf '\t'`; # literal TAB char will be used below
sed -ne '
/^Policy Name:/!d
s/.*:[[:space:]]\{1,\}//;h
:1
n
/Active:[[:space:]]\{1,\}no/d
/^[[:space:]]*Policy Type:/{
s/.*:[[:space:]]\{1,\}//;H
}
\|^[[:space:]]*LC/CY/Custmr:|!b1
:2
s/.*[[:space:]]\([^[:space:]]*\)[[:space:]]*/\1/
G;s/\n/'"${TAB}"'/pg;n
/^[[:space:]]*$/d
/Include:/d
b2
' yourpolicyfile
Resultados
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle