compreensão do código sed para processamento de texto

compreensão do código sed para processamento de texto

Alguém poderia me explicar isso abaixo do 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
    '

Quero editar para adicionar informações de "Tipo de política:", quando as substituo por "Nome da política:" funciona bem. No entanto, quando adiciono uma seção como abaixo, obviamente não funciona porque estou tentando sem entender.

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
    '

Também tenho uma solução para o código equivalente do AIX abaixo do mesmo fórum. Preciso entendê-lo para editá-lo e adicionar o 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

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

Responder1

Ok, vamos fazer isso passo a passo:

sed -n '

A -nopção não produz sednada, a menos que seja informado

/Policy Name:/! d

Todas as linhas que não contêm Policy name:são excluídas. O restante do script é processado apenas nos loops seguintes.

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

Isso remove tudo até os :espaços finais e coloca o restante no buffer de retenção para uso posterior.

:1
n

Este é o início de um loop lendo novas linhas

/Active:\s*no/d

Linhas com esse padrão são removidas, então obviamente não há interesse em inativos

/HW\//!b1

E agora, fazemos um loop para :1se a linha não contiverHW/

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

No início do próximo loop, remova tudo, exceto a última sequência de espaços não vazios.

G
s/\n/\t/p

Em seguida, anexe o nome da política mantida no buffer de espera, separado por uma tabulação e imprima essa linha

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

e isso se repete nas próximas linhas até atingirmos o padrão fornecido.

Você deve observar que este é um código altamente não portável que não funcionará em muitas sedversões.

Editar:Para adicionar o Tipo de Política como terceira coluna você deve adicionar esta linha ao script antes ou depois da Active:verificação:

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

Ou seja: Se a linha contiver a referida string, execute os comandos entre {}. Esses comandos removem a parte até os :espaços em branco e acrescentam o restante da linha (que deveria conter o tipo de política) ao buffer de retenção. Assim, o buffer de retenção contém o nome e o tipo da política, separados por uma nova linha. Portanto, quando acrescentamos isso G, haverá duas novas linhas a serem substituídas, portanto, o comando de substituição precisa obter o gsinalizador para substituir todas as ocorrências:

s/\n/\t/gp

O script AIX é basicamente o mesmo, mas evitando extensões GNU para expressões regulares. Principalmente o uso de variáveis ​​para corresponder a espaços em branco ou tabulações, pois \tnão funcionará em todos sedos sabores, bem como +para "um ou mais" precisa ser substituído por\{1,\}

informação relacionada