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
更清楚。
我有这种类型的数据:
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
更清楚。