AIX 的等效 sed linux 命令

Equivalent sed linux command for AIX

我有这种类型的数据:

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.

你能帮帮我吗?

好久没用过AIX了

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

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

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

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

使用awk:

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

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

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

来自POSIX specification for sed(已强调):

A function can be preceded by a '!' character, in which case the function shall be applied if the addresses do not select the pattern space. Zero or more <blank> characters shall be accepted before the '!' character. It is unspecified whether <blank> characters can follow the '!' character, and conforming applications shall not follow the '!' character with <blank> characters.

我怀疑您 运行 喜欢它。 GNU sed 允许空格,AIX sed 可能不允许。

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

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