AIX 的 sed 等效代码

AIX 的 sed 等效代码

有人能给我下面 sed 代码的等效代码吗?它在 Linux 上运行良好,但是在 AIX 上运行时出现错误“sed: 0602-403 /Policy Name:/!d is not a recognized 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,\}or$s$s*其中 $s 是正则表达式原子。
  • \t也不是POSIX。在这里,shell 变量$TAB就派上用场了。
  • 中的\|操作的是。我们必须将其分解为多个部分并重新安排逻辑。ORsednon-POSIX

警告

  1. 您可能会shell尝试围绕角色进行历史扩展!d。在这种情况下,请在该区域周围使用单引号。对于其余的变量,需要使用双引号$s, $S, $TAB才能扩展。
  2. 正则表达式$S将匹配 a,\n如图所示。但这种情况永远不会出现在您的代码中,因为您正在更改 NL -> TAB。

答案2

这是经过重新设计的代码,用于合并策略名称,同时也使其符合 POSIX 标准。请注意,所有对\s-> [[:space:]]\S-> [^[:space:]]\+->的引用\{1,\}

PS:不确定这条/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

相关内容