AIX 的等效 sed linux 命令

Posted

技术标签:

【中文标题】AIX 的等效 sed linux 命令【英文标题】:Equivalent sed linux command for AIX 【发布时间】: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 手册页。历史替换看起来并不令人困惑。错误消息几乎准确地反映了您显示的内容 - xxxxxxx 存在差异,但这是在您的转录中还是在机器上?有人建议安装 GNU sed;如果这是一个选项,它可能在短期内是最简单的...... 错误信息很奇怪 - 0602-403 来自哪里? @JonathanLeffler 谢谢,很高兴知道。 AIX 有一个类似0602-403 的消息标识符,可用于查找有关特定错误的更多信息——这在AIX 上很正常,@KamilCuk。它有助于处理 I18N/L10N 等问题。 【参考方案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>1sub(/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 在这种情况下也应该可以工作

以上是关于AIX 的等效 sed linux 命令的主要内容,如果未能解决你的问题,请参考以下文章

Windows 等效于 linux cksum 命令

aix 上的 sed 正则表达式问题

AIX 上的 Sed 无法识别 -i 标志

AIX 上的 sed 正则表达式问题(第 2 部分)

AIX 脚本中的 sed 不适用于特殊字符 [重复]

Linux stat命令和AIX istat命令 (查看文件修改时间)