Könnte mir jemand einen entsprechenden Code für den folgenden Sed-Code geben? Unter Linux funktioniert er einwandfrei. Unter AIX erhalte ich jedoch die Fehlermeldung „sed: 0602-403 /Policy Name:/! d ist keine erkannte Funktion“.
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
'
Eingabedatei
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:
Gewünschte Ausgabe
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle
Antwort1
# 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
Kommentare
AIX
sed
wird nicht\s
\S
als Leerzeichen oder Nicht-Leerzeichen verstanden.POSIX
sed
verstehtsed
in Ihrem Fall kein Leerzeichen vor einem Befehl/.../! d
.- Beachten Sie auch, dass dies
\+
nicht der Fall istPOSIX
. Der korrekte Ausdruck hierfür ist:\{1,\}
oder$s$s*
wobei $s Regex-Atome sind. \t
ist auch nichtPOSIX
. Hier$TAB
kommt die Shell-Variable ins Spiel.- Die
\|
für dieOR
Operation insed
istnon-POSIX
. Wir müssen es in Teile aufteilen und die Logik neu anordnen.
Vorbehalt
- Möglicherweise
shell
versuchen Sie, die Verlaufserweiterung um das!d
Zeichen herum durchzuführen. Verwenden Sie in diesem Fall einfache Anführungszeichen um diesen Bereich. Im Übrigen sind die doppelten Anführungszeichen erforderlich, damit die$s, $S, $TAB
Variablen erweitert werden können. - Der
$S
reguläre Ausdruck wird mit a übereinstimmen,\n
wie gezeigt. Aber dieses Szenario tritt in Ihrem Code nie auf, da Sie NL -> TAB ändern.
Antwort2
Dies ist der überarbeitete Code, um die Richtliniennamen einzubinden und ihn POSIX-kompatibel zu machen. Beachten Sie, dass alle Verweise auf \s
-> [[:space:]]
, \S
-> [^[:space:]]
, \+
->\{1,\}
PS: Ich bin nicht sicher, was die /HW\//!b1
Zeile im Originalcode macht. Sie sitzt dort wie ein appendix
, was sich nur als schmerzhaft erweisen kann, wenn man nicht aufpasst.
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
Ergebnisse
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle