有人能給我下面 sed 程式碼的等效程式碼嗎?它在 Linux 上運作良好,但是在 AIX 上運行時出現錯誤「sed: 0602-403 /Policy Name:/!d is not a recognized function」。
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,\}
or$s$s*
其中 $s 是正規表示式原子。 \t
也不是POSIX
。在這裡,shell 變數$TAB
就派上用場了。- 中的
\|
操作的是。我們必須將其分解為多個部分並重新安排邏輯。OR
sed
non-POSIX
警告
- 您可能會
shell
嘗試圍繞角色進行歷史擴展!d
。在這種情況下,請在該區域周圍使用單引號。對於其餘的變量,需要使用雙引號$s, $S, $TAB
才能擴展。 - 正規表示式
$S
將會符合 a,\n
如圖所示。但這種情況永遠不會出現在您的程式碼中,因為您正在更改 NL -> TAB。
答案2
這是經過重新設計的程式碼,用於合併策略名稱,同時也使其符合 POSIX 標準。請注意,所有對\s
-> [[:space:]]
、\S
-> [^[:space:]]
、\+
->的引用\{1,\}
PS:不確定這條/HW\//!b1
線在原版中做什麼。程式碼,像一個 一樣坐在那裡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