sed código equivalente para AIX

0

Alguém poderia me fornecer um código equivalente abaixo do código sed? funciona bem no Linux No entanto, estou recebendo o erro "sed: 0602-403 / Nome da política: /! d não é uma função reconhecida" ao executar no AIX.

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

Arquivo 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:

Saída desejada

Cindy    Today     Standard
Victor   Today     Standard
Bob      Today     Standard
Martha   Tomorrow  Oracle
Sam      Tomorrow  Oracle
    
por Sid 27.05.2017 / 00:34

2 respostas

0

Este é o código retrabalhado para incorporar os nomes das políticas, como também para torná-lo compatível com POSIX. Observe que todas as referências a \s - > [[:space:]] , \S - > [^[:space:]] , \+ - > \{1,\}

P.S .: Não tenho certeza do que a linha /HW\//!b1 está fazendo no orig. código, sentado lá como um appendix , que só pode ser doloroso se não tiver 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:]]*//
      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
    
por 06.06.2017 / 17:57
2
# define constants
SPC='echo x | tr x '0''
TAB='echo x | tr x '1''
 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*//
      G
      s/\n/$TAB/p
      n
      /^$s*\$/d
      /Include:/d
   b2
"  yourfile

Comentários

  • AIX sed não entende \s \S como espaço em branco ou não-branco.
  • POSIX sed não entende um espaço antes de um comando sed , no seu caso /.../! d .
  • Observe também que \+ não é POSIX . A expressão correta para isso é: \{1,\} ou $s$s* em que $ s são átomos de expressão regular.
  • \t também não é POSIX . Aqui, a variável do shell $TAB é útil.
  • O \| da operação OR em sed é non-POSIX . Temos que dividir em partes e reorganizar a lógica.

Advertência

  1. Pode ser que o seu shell tente fazer uma expansão do histórico em torno do caractere !d . Nesse caso, use aspas simples nessa região. Para o resto, as aspas duplas são necessárias para que as variáveis $s, $S, $TAB possam ser expandidas.
  2. O $S regex corresponderá a \n conforme mostrado. Mas esse cenário nunca ocorre no seu código, pois você está alterando o NL - > TAB.
por 27.05.2017 / 09:47

Tags