Alguém poderia me fornecer um código equivalente para o código sed abaixo? funciona bem no Linux. No entanto, estou recebendo o erro "sed: 0602-403 /Policy Name:/! 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*/\1/
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
Responder1
# 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
Comentários
AIX
sed
não entende\s
\S
como espaço em branco ou não-espaço em branco.POSIX
sed
não entende um espaço antes de umsed
comando, no seu caso/.../! d
.- Observe também que
\+
não éPOSIX
. A expressão correta para isso é:\{1,\}
ou$s$s*
onde $s são átomos de regex. \t
também não éPOSIX
. Aqui, a variável shell$TAB
é útil.- O
\|
para aOR
operação emsed
énon-POSIX
. Temos que dividi-lo em partes e reorganizar a lógica.
Embargo
- Pode ser que você
shell
tente expandir a história em torno do!d
personagem. Nesse caso, use aspas simples nesta região. De resto, as aspas duplas são necessárias para que as$s, $S, $TAB
variáveis possam ser expandidas. - A
$S
regex IRÁ corresponder a\n
como mostrado. Mas esse cenário nunca ocorre no seu código, pois você está alterando NL -> TAB.
Responder2
Este é o código retrabalhado para incorporar os nomes das políticas, bem como para torná-lo compatível com POSIX. Observe que todas as referências a \s
-> [[:space:]]
, \S
-> [^[:space:]]
, \+
->\{1,\}
PS: Não tenho certeza do que a /HW\//!b1
linha está fazendo no original. código, parado ali como um appendix
, o que só pode ser doloroso se não tomarmos 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