AIX용 sed 동등한 코드

AIX용 sed 동등한 코드

누군가 나에게 아래 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 sedsed귀하의 경우 명령 앞의 공백을 이해하지 못합니다 /.../! d.
  • 또한 이(가) \+아닙니다 POSIX. 이에 대한 올바른 표현은 다음과 같습니다. \{1,\}또는 $s$s*여기서 $s는 정규식 원자입니다.
  • \t또한 그렇지 않습니다 POSIX. 여기서는 쉘 변수가 $TAB유용합니다.
  • 의 작업 \|에 대한 은( 는) 입니다 . 우리는 그것을 여러 부분으로 나누고 논리를 다시 배열해야 합니다.ORsednon-POSIX

경고

  1. shell캐릭터 를 중심으로 역사 확장을 시도하는 것일 수도 있습니다 !d. 이 경우 이 영역 주위에 작은따옴표를 사용하십시오. 나머지의 경우 $s, $S, $TAB변수를 확장하려면 큰따옴표가 필요합니다.
  2. 정규 표현식은 표시된 것과 $S일치합니다 . \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

관련 정보