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
手册页。历史替换看起来并不令人困惑。错误消息几乎准确地反映了您显示的内容 - xxx
与 xxxx
存在差异,但这是在您的转录中还是在机器上?有人建议安装 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>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 命令的主要内容,如果未能解决你的问题,请参考以下文章