在 AIX 上使用 sed 与在 Linux 上使用 sed 有何不同

在 AIX 上使用 sed 与在 Linux 上使用 sed 有何不同

我知道-iAIX 的 sed 中不存在该选项,但最近我在尝试编辑 AIX 中的 /etc/services 文件时遇到了不同的问题。

我需要替换此文件中的一行,例如替换这一行:

nimhttp         4901/udp

我应该有这个:

nimhttp         5001/tcp

在 Linux 上,我可以使用这个 barberian 命令:

sed 's/nimhttp         4901\/udp/nimhttp         5001\/tcp/g' /etc/services > /etc/services.tmp

或者也许我可以更聪明一点,使用这个:

sed 's/^nimhttp\s\{3,\}4901\/udp/nimhttp\s\{9\}5001\/tcp/g' /etc/services > /etc/services.tmp

并且仍然根据需要编辑我的 .tmp 文件。

在 AIX 上,我尝试过的这些命令(以及许多其他命令)都不起作用。试图弄清楚它们之间有什么区别,但sed本身就是一个复杂的命令,我不能。

所以我的问题是,是否有人知道为什么这在 AIX 上不起作用,或者我能否找到两个系统上 sed 命令的两个版本之间的差异列表?

Linux sed 命令版本是 4.2.2,AIX 的版本未知,因为它sed --version不起作用,sed 的手册页中也没有提到如何查找版本,但我认为它也是最新版本,因为我使用的是 AIX 7.2

答案1

正如 Lorinczy Zsigmond 所说,Linux 版本sed实现了很多功能GNU Extensions以简化其使用。

要在 Linux 下测试,请使用sed --posix(欢迎来到旧 Unix 世界 ;-p)

对于您想要在“posix”模式下实现的工作,以下两个命令有效:

/tmp/test$ cat test_file
nimhttp         4901/udp
/tmp/test$ sed --posix -e 's/4901\/udp/5001\/tcp/g' test_file 
nimhttp         5001/tcp
/tmp/test$ sed --posix -e 's#4901/udp#5001/tcp#g' test_file 
nimhttp         5001/tcp

如果您还想匹配服务名称:

/tmp/test$ cat test_file
nimhttp         4901/udp
nimnothttp      104901/udp
/tmp/test$ sed --posix -e 's#\(nimhttp.*\)4901/udp#\15001/tcp#g' test_file 
nimhttp         5001/tcp
nimnothttp      104901/udp

注意,\( \)用于记忆匹配的模式。然后,您可以使用 来调用所记忆的模式\1(或\2\3... 取决于所记忆模式的数量)。

也许您曾经使用的命令不起作用......但就像使用 Perl 一样,总是有几种方法可以用来完成相同的事情sed

相关内容