누구든지 다음 sed 코드를 설명할 수 있습니까?
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 Type:" 정보를 추가하도록 편집하고 싶습니다. "Policy Name:"으로 바꾸면 제대로 작동하지만 아래와 같은 섹션을 추가하면 분명히 작동하지 않습니다. 이해하지 못한 채 시도해보세요. .
sed -n '
/Policy Name:/! d
s/.*:\s\+//
h
:1
n
/Policy Type:/! 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
'
또한 정책 유형을 추가하기 위해 편집하기 위해 이해해야 하는 AIX에 대한 동등한 코드가 포함된 동일한 포럼의 솔루션이 있습니다.
# 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
입력 파일
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
좋습니다. 단계별로 살펴보겠습니다.
sed -n '
달리 명시하지 않는 한 이 -n
옵션은 아무것도 출력하지 않습니다.sed
/Policy Name:/! d
포함되지 않은 모든 행은 Policy name:
삭제됩니다. 스크립트의 나머지 부분은 다음 루프에서만 처리됩니다.
s/.*:\s\+//
h
이렇게 하면 후행 공백까지 모두 제거되고 :
나머지는 나중에 사용할 수 있도록 유지 버퍼에 저장됩니다.
:1
n
이것은 새로운 줄을 읽는 루프의 시작입니다
/Active:\s*no/d
해당 패턴이 있는 줄은 제거되므로 비활성에는 당연히 관심이 없습니다.
/HW\//!b1
:1
이제 라인에 다음이 포함되어 있지 않은지 확인하기 위해 반복합니다.HW/
:2
s/.*\s\(\S*\)\s*/\1/
다음 루프가 시작되면 비어 있지 않은 마지막 시퀀스를 제외한 모든 항목을 삭제합니다.
G
s/\n/\t/p
그런 다음 보존 버퍼에 저장된 정책 이름을 탭으로 구분하여 추가하고 해당 줄을 인쇄합니다.
n
/^\s*$\|Include:/! b2
'
이것은 주어진 패턴에 도달할 때까지 다음 몇 줄에서 반복됩니다.
이는 이식성이 매우 낮은 코드이며 sed
많은 버전에서 실행되지 않습니다.
편집하다:정책 유형을 세 번째 열로 추가하려면 확인 전후에 다음 줄을 스크립트에 추가해야 합니다 Active:
.
/Policy Type:/{s/.*:\s*//;H;}
즉, 행에 해당 문자열이 포함되어 있으면 사이에 명령을 실행하십시오 {}
. 이 명령은 최대 :
공백과 후행 공백을 제거하고 나머지 줄(정책 유형을 포함해야 함)을 보존 버퍼에 추가합니다. 따라서 보존 버퍼에는 줄 바꿈으로 구분된 정책 이름과 유형이 포함됩니다. 따라서 이것을 에 추가하면 G
두 개의 줄 바꿈이 대체되므로 바꾸기 명령은 g
모든 항목을 대체하기 위한 플래그를 가져와야 합니다.
s/\n/\t/gp
AIX 스크립트는 기본적으로 동일하지만 정규식에 대한 GNU 확장을 피합니다. \t
모든 sed
스타일 에서 작동하지 않으며 +
"하나 이상"을 다음으로 바꿔야 하므로 주로 변수를 사용하여 공백이나 탭을 일치시킵니다.\{1,\}