código equivalente sed para AIX

código equivalente sed para AIX

¿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 sedno entiende \s \Scomo espacios en blanco o no espacios en blanco.
  • POSIX sedno entiende un espacio antes de un sedcomando, en su caso /.../! d.
  • También tenga en cuenta que \+no lo es POSIX. La expresión correcta para eso es: \{1,\}o $s$s*donde $s son átomos de expresiones regulares.
  • \ttampoco lo es POSIX. Aquí, la variable de shell $TABresulta útil.
  • El \|para la ORoperación en sedes non-POSIX. Tenemos que dividirlo en partes y reorganizar la lógica.

Advertencia

  1. Puede ser que intentes shellhacer una expansión histórica en torno al !dpersonaje. En ese caso, utilice comillas simples en esta región. Por lo demás se requieren las comillas dobles para que las $s, $S, $TABvariables se puedan expandir.
  2. La $Sexpresión regular coincidirá con a \ncomo 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\//!b1está 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

información relacionada