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. 정규식은 표시된 대로 $Sa와 일치합니다 \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

관련 정보