我的问题类似于如何防止 sed -i 破坏符号链接?,但关于硬链接。
使用sed -i
对文件的工作写入到一个临时文件,然后移动这会破坏所有的文件有硬链接,因为sed的作品。该--follow-symlinks
参数在硬链接的情况下没有帮助。
是否有使用相当丑陋的替代方法:
sed 's/cat/dog/' pet_link > pet_link
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 12
对于sed 's/cat/dog/'
或任何其他不会改变文件大小的替换,使用任何类似 Bourne 的 shell,您可以执行以下操作:
sed 's/cat/dog/' < file 1<> file
Run Code Online (Sandbox Code Playgroud)
鲜为人知但已超过 35 岁¹ 的标准 <>
运算符是以读+写模式打开文件而不会被截断。基本上,这使得sed
将其输出写入其输入。确保输出不会覆盖sed
尚未读取的文件部分非常重要。
对于导致文件大小减小的替换,使用ksh93
:
sed 's/hippopotamus/ant/' < file 1<>; file
Run Code Online (Sandbox Code Playgroud)
<>;
,ksh93
扩展名与其他相同,<>
只是如果被重定向的命令成功,则文件在命令完成的地方被截断。
或者使用 perl:
perl -pe 's/hippopotamus/ant/;
END{truncate STDOUT, tell STDOUT}' < file 1<> file
Run Code Online (Sandbox Code Playgroud)
对于其他任何事情,只需使用标准形式:
cp -i file file.back &&
sed 's/dog/horse/g' < file.back > file # && rm -f file.back
Run Code Online (Sandbox Code Playgroud)
¹ 尽管 Bourne shell 和 Korn shell 的早期版本中的初始实现实际上已被破坏,但在 80 年代后期已修复。而 Almquist shell 最初并不支持它。