sed -i
在符号链接上应用编辑时,我注意到一个奇怪的行为。文档说-i
将进行就地编辑。但是,符号链接会被文件替换。
重现步骤:
cd /tmp
echo blah > foo
ln -s foo bar
sed -i -e 's/ah/ub/' bar
ls -l
将导致:
-rw-rw-r--. 1 arogge arogge 5 Mar 9 15:07 bar
-rw-rw-r--. 1 arogge arogge 5 Mar 9 15:07 foo
这是预期的行为还是一个错误sed
?
答案1
这是预期的行为。
-i
/标志--in-place
编辑文件的临时副本,然后将该副本移动到原始文件上。
所以当你这样做时:
sed -i 'bla' symlink
sed 正在做的是:
sed 'bla' symlink > temp_file
mv temp_file symlink
因此通过在其位置放置常规文件来破坏符号链接。
答案2
完整列表是否包含这样的内容
lrw-rw-r--. 1 arogge arogge 5 Mar 9 15:07 bar-e -> foo
这是预期的行为。来自 sed 的手册页
-i 扩展名
就地编辑文件,使用指定的扩展名保存备份。
sed 似乎将 -e 解释为 -i 的扩展名。