【问题标题】:Equivalent sed linux command for AIXAIX 的等效 sed linux 命令
【发布时间】:2020-07-01 16:16:48
【问题描述】:

我有这种类型的数据:

xxxx aaaaaaaaaaaaaaaaaaa
xxxx bbbbbbbbbbbbbbbbbbb
xxxx ccccccccccccccccccc
xxxx ddddddddddddddddddd
xxxx eeeeeeeeeeeeeeeeeee

我想要这个输出:

xxxx aaaaaaaaaaaaaaaaaaa
'' bbbbbbbbbbbbbbbbbbb
'' ccccccccccccccccccc
'' ddddddddddddddddddd
'' eeeeeeeeeeeeeeeeeee

在 linux 上我可以做到:

sed "1 ! s|xxxx|''|" data.txt

但是当我在 AIX 上尝试这个时:

sed: 0602-403 1 ! s|xxx|''| is not a recognized function.

你能帮帮我吗?

【问题讨论】:

  • 如果你使用sed '1 ! s|xxxx|'\'\''|' data.txt,它是否有效? ! 在双引号内可能会导致问题,但不确定
  • 这很奇怪; ! 是 sed 的 POSIX 规范的一部分,所以它应该可以正常工作。使用| 而不是/ 也应该没问题。 1、! 和 s 周围的间距无关紧要。我会尝试所有这些变体;我会查看 AIX sed 手册页。历史替换看起来并不令人困惑。错误消息几乎准确地反映了您显示的内容 - xxx 与 xxxx 存在差异,但这是在您的转录中还是在机器上?有人建议安装 GNU sed;如果这是一个选项,它可能在短期内是最简单的......
  • 错误信息很奇怪 - 0602-403 来自哪里? @JonathanLeffler 谢谢,很高兴知道。
  • AIX 有一个类似0602-403 的消息标识符,可用于查找有关特定错误的更多信息——这在AIX 上很正常,@KamilCuk。它有助于处理 I18N/L10N 等问题。

标签: linux sed aix


【解决方案1】:

来自POSIX specification for sed(已添加重点):

函数前面可以有'!'字符,在这种情况下,如果地址不选择模式空间,则应应用该功能。在 '!' 之前应接受零个或多个 <blank> 字符特点。 未指定<blank> 字符是否可以跟在“!”后面字符和符合要求的应用程序不得跟随“!”带有<blank> 字符的字符。

我怀疑你遇到了这个问题。 GNU sed 允许之间有空格,AIX sed 可能不允许。

改用sed "1!s|xxxx|''|" data.txt,我敢打赌它会起作用。

不过,我确实认为评论中建议的 sed "2,$ s/xxxx/''/" data.txt 更清晰。

【讨论】:

  • 很好地挖掘出那句话。我在对这个问题的评论中对此感到疑惑,但也许我涵盖了太多可能性。
  • @JonathanLeffler 从我收集到的二手资料来看,AIX 实用程序遵循 POSIX 到 T,如果它表示某些内容是可选的或未指定是否被接受,通常不是。
  • 我怀疑另一种看待它的方式是 POSIX 委员会查看了现有的实现,包括 IBM/AIX,并编写了规范,以便它们都符合标准。
【解决方案2】:

您可以使用 shell 保存第一行,然后在其余部分调用 sed:

{ IFS= read -r firstline; printf "%s\n" "$firstline"; sed "s|xxxx|''|"; } <input

【讨论】:

    【解决方案3】:

    使用awk:

    $ awk -v q="''" 'NR>1{sub(/xxxx/, q)} 1' ip.txt
    xxxx aaaaaaaaaaaaaaaaaaa
    '' bbbbbbbbbbbbbbbbbbb
    '' ccccccccccccccccccc
    '' ddddddddddddddddddd
    '' eeeeeeeeeeeeeeeeeee
    
    • -v q="''" 创建变量 q,其值为 ''
    • NR&gt;1 如果行号大于1
    • sub(/xxxx/, q) 将 xxxx 替换为输入行的 q 变量的内容
      • 如果你总是需要替换整个第一个字段,你可以在这里使用$1=q而不是sub
    • 1 打印输入行的内容,存在于$0 特殊变量中

    【讨论】:

      【解决方案4】:

      我已经很久没有做任何 AIX 了。

      为您的 AIX 系统安装 GNU sed 可能会更容易,特别是如果您认为您将大量移植 Linux shell 代码。

      另外,使用 shell 链接的两个 sed 命令可能会起作用,例如:

      sed -n "1p" < input
      sed -n "2,$ s|xxxx|''|p" < input
      

      请注意,我没有在 AIX 系统上测试过。这只是一个猜测。

      【讨论】:

      • 第一个命令可以使用sed 1q input。你也可以将这两个命令组合成sed -n -e '1p' -e "2,$ s/xxxx/''/p",甚至(可能)sed -n -e "1p; 2,$ s/xxxx/''/p"。所有假设 AIX sed 行为合理正常,它可能确实如此,但随后问题也被问到了。
      • sed -n -e "1p; 2,$ s/xxxx/''/p" data.txt 完美运行!非常感谢!
      • sed "2,$ s/xxxx/''/" data.txt 在这种情况下也应该可以工作
      猜你喜欢
      • 2017-06-19
      • 2014-03-20
      • 1970-01-01
      • 2013-05-08
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2021-06-07
      相关资源
      最近更新 更多