どなたか、以下の sed コードに相当するコードを教えていただけませんか? Linux では問題なく動作しますが、AIX で実行すると「sed: 0602-403 /Policy Name:/! d は認識された関数ではありません」というエラーが発生します。
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
'
入力ファイル
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:
望ましい出力
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle
答え1
# 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
コメント
AIX
sed
\s
\S
空白または非空白として認識されません。POSIX
sed
sed
あなたの場合、コマンドの前のスペースは理解されません/.../! d
。- また、 は
\+
ではないことにも注意してくださいPOSIX
。その正しい表現は または です。\{1,\}
ここ$s$s*
で、 $s は正規表現アトムです。 \t
も同様ですPOSIX
。ここで、シェル変数が$TAB
役立ちます。- の操作
\|
の はです。これを部分に分割してロジックを再配置する必要があります。OR
sed
non-POSIX
警告
shell
文字の周囲で履歴拡張を行おうとしている可能性があります。その場合は、この領域を一重引用符で囲みます。それ以外の場合は、変数を展開できるようにする!d
ために二重引用符が必要です。$s, $S, $TAB
- 正規表現は、示されているように
$S
a に一致します\n
。ただし、NL -> TAB を変更しているため、コード内でこのシナリオが発生することはありません。
答え2
これは、ポリシー名を組み込み、POSIXに準拠するように再加工されたコードです。- \s
> [[:space:]]
、\S
-> [^[:space:]]
、\+
->へのすべての参照が\{1,\}
/HW\//!b1
PS:元のコードでこの行が何をしているのかはわかりませんが、 のようにそこに存在しておりappendix
、注意しないと痛い目に遭う可能性があります。
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
結果
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle