我知道-i
AIX 的 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
。