
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 -n
opção não produz sed
nada, 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 :1
se 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 sed
versõ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 g
sinalizador 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 \t
não funcionará em todos sed
os sabores, bem como +
para "um ou mais" precisa ser substituído por\{1,\}