在 Solaris 中是否有替代“sed -i”命令的方法?

tps*_*wal 12 solaris sed text-processing

我在我的项目中有一个要求,将文件中的一些现有文本替换为foo其他一些文本,例如fooofoo

abc.txt
name
foo
foo1
Run Code Online (Sandbox Code Playgroud)

所以我试过:

abc.txt
name
foo
foo1
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

sed:非法选项—— i

我在手册中发现我必须使用:

sed -i "s/foo/fooofoo/g" abc.txt
Run Code Online (Sandbox Code Playgroud)

但是,这也不起作用。

我在perl和 中找到了替代方案,awksed非常感谢Solaris 中的解决方案。

我正在使用这个版本的 bash:

GNU bash,版本 3.2.57(1)-release (sparc-sun-solaris2.10)

don*_*sti 15

使用ed. 它在大多数平台上都可用,并且可以就地编辑您的文件。
因为sed基于ed语法替换模式是类似的:

ed -s infile <<\IN
,s/old/new/g
w
q
IN
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 8

如果您无法安装 GNU sed,请使用:

sed "s/foo/fooofoo/g" abc.txt >abc.tmp && mv abc.tmp abc.txt
Run Code Online (Sandbox Code Playgroud)

这使用重定向将 sed 的输出发送到临时文件。如果 sed 成功完成,那么这将abc.txt用临时文件覆盖。

从 GNU sed 的源代码可以看出,这正是sed -i它的作用。因此,这与sed -i.

如果可能abc.tmp已经存在,那么您可能希望使用mktemp或类似的实用程序来为临时文件生成唯一名称。

  • 不想破坏它,但即使 sed 也会创建一个临时文件。http://git.savannah.gnu.org/cgit/sed.git/tree/sed/sed.c#n84 (10认同)