有没有办法让 perl -i 不破坏符号链接?

mat*_*tdm 13 command-line utilities perl text-processing symlink

我的一个朋友指出,如果你这样做:

perl -pi.bak -e 's/foo/bar/' somefile
Run Code Online (Sandbox Code Playgroud)

当“somefile”实际上是一个符号链接时,perl 会按照文档所说的去做:

它通过重命名输入文件、按原始名称打开输出文件并选择该输出文件作为 print() 语句的默认文件来实现此目的。扩展名(如果提供)用于修改旧文件的名称以制作备份副本 [...]

这会导致一个新的符号链接“somefile.bak”指向未更改的真实文件,以及一个新的、已更改的常规文件“somefile”与更改。

在许多情况下,跟随符号链接将是所需的行为(即使它使 .bak 文件的正确位置不明确)。除了测试包装器中的符号链接并适当处理案例之外,是否有一种简单的方法可以做到这一点?

sed做同样的事情,这是值得的。)

imz*_*hev 6

我想知道sponge来自moreutils的小型通用实用程序(“吸收标准输入并写入文件”)在这种情况下是否会有所帮助,以及它是否会遵循符号链接。

作者 sponge这样描述的

它解决了使用 Unix 工具就地编辑文件的问题,即如果您只是将输出重定向到您尝试编辑的文件,则重定向在管道中的第一个命令之前生效(破坏文件的内容)开始从文件中读取。类似sed -iperl -i解决此问题的开关,但并非您可能想在管道中使用的每个命令都有这样的选项,并且无论如何您都不能将这种方法用于多命令管道。

我通常使用海绵有点像这样:

sed '...' file | grep '...' | sponge file
Run Code Online (Sandbox Code Playgroud)