누군가 나에게 아래 sed 코드와 동등한 것을 줄 수 있습니까? Linux에서는 잘 실행되지만 AIX에서 실행하면 "sed: 0602-403 /Policy Name:/!d is not a recognition 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,\}
또는$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
추신: 이 줄이 원본에서 어떤 역할을 하는지 잘 모르겠습니다 . 코드는 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