sed-Äquivalentcode für AIX

sed-Äquivalentcode für AIX

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 sedwird nicht \s \Sals Leerzeichen oder Nicht-Leerzeichen verstanden.
  • POSIX sedversteht sedin Ihrem Fall kein Leerzeichen vor einem Befehl /.../! d.
  • Beachten Sie auch, dass dies \+nicht der Fall ist POSIX. Der korrekte Ausdruck hierfür ist: \{1,\}oder $s$s*wobei $s Regex-Atome sind.
  • \tist auch nicht POSIX. Hier $TABkommt die Shell-Variable ins Spiel.
  • Die \|für die OROperation in sedist non-POSIX. Wir müssen es in Teile aufteilen und die Logik neu anordnen.

Vorbehalt

  1. Möglicherweise shellversuchen Sie, die Verlaufserweiterung um das !dZeichen 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, $TABVariablen erweitert werden können.
  2. Der $Sreguläre Ausdruck wird mit a übereinstimmen, \nwie 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\//!b1Zeile 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

verwandte Informationen