텍스트 처리를 위한 sed 코드 이해

텍스트 처리를 위한 sed 코드 이해

누구든지 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줄에 no가 포함되어 있는지 반복합니다.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,\}

관련 정보