当前位置:首页 > 科技  > 软件

Sed 原地替换文件时遇到的趣事

来源: 责编: 时间:2023-11-04 23:04:48 241观看
导读哈喽大家好,我是咸鱼在文章《三剑客之 sed》中咸鱼向大家介绍了文本三剑客中的 sedsed 全名叫 stream editor,流编辑器,用程序的方式来编辑文本那么今天咸鱼打算讲一下我在用 sed 原地替换文件时遇到的趣事sed 让文件属

哈喽大家好,我是咸鱼Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

在文章《三剑客之 sed》中咸鱼向大家介绍了文本三剑客中的 sedTk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

sed 全名叫 stream editor,流编辑器,用程序的方式来编辑文本Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

那么今天咸鱼打算讲一下我在用 sed 原地替换文件时遇到的趣事Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

sed 让文件属性变了?

Tk428资讯网——每日最新资讯28at.com

有这么一个普通文件 test.txt ,内容如下:Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

link_test.txt 是一个软链接(Symbolic Link,也可以叫符号链接)文件,指向 test.txt 文件Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

软链接文件类似于 Windows 的快捷方式,它实际上是一个特殊的文件。关于软链接相关的内容这里不过多介绍Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

如果我们对软链接文件内容进行修改,源文件是会跟着改变的Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

当我使用 sed 对软链接文件 link_test.txt 进行内容修改时,命令如下Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

有趣的现象发生了:使用 sed 对软链接文件 link_test.txt 进行内容修改之后,源文件 test.txt 内容没有变化,软链接文件link_test.txt 的内容发生变化且变成了普通文件Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

怎么样,是不是很神奇?sed 不但把文件内容改了,还把文件属性也给改了Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

我们用 strace 工具来查看一下在执行 sed 命令时操作系统做了哪些操作Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

strace 一个系统调用跟踪工具,它会跟踪并记录命令运行期间的系统调用和信号Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

具体内容有点多,我们着重看下关键内容Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

由上图可以知道,如果我们使用 sed 对一个文件进行原地替换,需要有一个临时文件,sed 先把修改内容写入到这个文件,最后将文件 rename 到原来的地方Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

那我的需求是对软链接文件 link_test.txt 进行内容修改,软链接文件属性不变,且源文件的内容也跟着改变,有没有什么方法呢?Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

也就是说我们希望命令在执行的时候能够解析出来软链接文件后面指向的源文件,直接对源文件进行读--处理--写,最后 renameTk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

sed 命令有一个选项 --follow-symlinksTk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

我们在执行的时候加上这个选项:Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

图片图片Tk428资讯网——每日最新资讯28at.com

Tk428资讯网——每日最新资讯28at.com

总结一下:Tk428资讯网——每日最新资讯28at.com

  • sed 替换的底层逻辑是把更新后的内容写入一个临时文件里面,然后再 rename 这个临时文件
  • 这样就会使得如果没有添加 –follow-symlinks 选项的话,对软链接文件进行 sed 操作就会使得软链文件变成了一个常规文件(其实是那个临时文件重命名导致的)
  • 如果要对软链接文件指向的源文件进行操作,就需要添加 –follow-symlinks 选项

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-16938-0.htmlSed 原地替换文件时遇到的趣事

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 【技术革命】JDK21虚拟线程来袭,让系统的吞吐量翻倍!

下一篇: 通过研究案例,彻底掌握Python GIL

标签:
  • 热门焦点
Top
Baidu
map