如何防止 sed -i 破坏符号链接?

mad*_*eon 33 sed symlink

为什么sed -i在符号链接上执行会破坏该链接并将其替换为目标文件?如何避免这种情况?

例如。

$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:46 pet
lrwxrwxrwx 1 madneon madneon 6 mar 23 16:48 pet_link -> pet

$ sed -i 's/cat/dog/' pet_link

$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:48 pet
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:49 pet_link
Run Code Online (Sandbox Code Playgroud)

为什么它不被认为是一个错误?

Ank*_*nko 39

-i/--in-place标记编辑到位的文件。默认情况下,sed读取给定文件,将其输出到临时文件中,然后将临时文件复制到原始文件上,而不检查原始文件是否是符号链接。

GNUsed有一个--follow-symlinks标志,它可以按照您的意愿运行:

$ echo "cat" > pet
$ ln --symbolic pet pet_link
$ sed --in-place --follow-symlinks 's/cat/dog/' pet_link
$ cat pet
dog
Run Code Online (Sandbox Code Playgroud)

  • 它不会就地编辑文件,而是编辑当前目录中文件的临时副本,然后将该临时副本移动到原始文件上。 (6认同)