首页 > 其他分享 >sed 原地替换文件时遇到的趣事

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

时间:2023-11-04 09:01:32浏览次数:28  
标签:趣事 文件 原地 sed link test txt 链接

哈喽大家好,我是咸鱼

在文章《三剑客之 sed》中咸鱼向大家介绍了文本三剑客中的 sed

sed 全名叫 stream editor,流编辑器,用程序的方式来编辑文本

那么今天咸鱼打算讲一下我在用 sed 原地替换文件时遇到的趣事

sed 让文件属性变了?

有这么一个普通文件 test.txt ,内容如下:

[root@localhost /opt]# cat test.txt 
My name is Ammon
hello world!
hahahahaha

link_test.txt 是一个软链接(Symbolic Link,也可以叫符号链接)文件,指向 test.txt 文件

软链接文件类似于 Windows 的快捷方式,它实际上是一个特殊的文件。关于软链接相关的内容这里不过多介绍

如果我们对软链接文件内容进行修改,源文件是会跟着改变的

当我使用 sed 对软链接文件link_test.txt 进行内容修改时,命令如下

[root@localhost /opt]# sed -i 's/Ammon/Edsion/g' link_test.txt 

有趣的现象发生了:使用 sed 对软链接文件link_test.txt 进行内容修改之后,源文件test.txt内容没有变化,软链接文件link_test.txt 的内容发生变化且变成了普通文件


怎么样,是不是很神奇?sed 不但把文件内容改了,还把文件属性也给改了

我们用 strace 工具来查看一下在执行 sed 命令时操作系统做了哪些操作

strace 一个系统调用跟踪工具,它会跟踪并记录命令运行期间的系统调用和信号

[root@localhost /opt]# strace sed -i 's/Ammon/Edsion/g' link_test.txt > strace.log 2>&1

具体内容有点多,我们着重看下关键内容

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

那我的需求是对软链接文件 link_test.txt 进行内容修改,软链接文件属性不变,且源文件的内容也跟着改变,有没有什么方法呢?

也就是说我们希望命令在执行的时候能够解析出来软链接文件后面指向的源文件,直接对源文件进行读--处理--写,最后 rename

sed 命令有一个选项 --follow-symlinks

--follow-symlinks: 
	follow symlinks when processing in place

我们在执行的时候加上这个选项:

[root@localhost /opt]# strace sed -i --follow-symlinks 's/Ammon/Edsion/g' link_test.txt > strace.log 2>&1


总结一下:

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

标签:趣事,文件,原地,sed,link,test,txt,链接
From: https://www.cnblogs.com/edisonfish/p/17808860.html

相关文章

  • 植物图形泛基因组Graph-based pan-genome
    目录图形泛基因组的构建图泛构建方法获取和合并PAV变异图泛的存储格式线性参考基因组坐标的恢复图泛的可视化图泛的注释基因结构注释图泛的变异注释结构变异鉴定与基因分型图泛比对软件的优势图泛的应用功能元件的鉴定现有物种中的图泛规模基于图泛的GWAS未来应用结论与未来展望......
  • Allwinner SoC based boards
    AllwinnerSoCbasedboardsForboardsusinganAllwinnerARMbasedSoC("sunxi"),theU-Bootbuildsystemgeneratesasingleintegratedimagefile: u-boot-sunxi-with-spl.bin. ThisfilecanbeusedonSDcards,eMMCdevices,SPIflashandforthe......
  • Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (released Oct 2023)
    Windows11version23H2中文版、英文版(x64、ARM64)下载(releasedOct2023)Windows11,version23H2,2023年10月31日发布请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新Windows体验,让您与热爱的人......
  • 基于ZYNQ的DVS/Event-based Camera项目
    一、项目简介本项目以zynq100为主体,使用索尼IMX646(1280×720)Event-based光传感器芯片,事件相机,也叫动态视觉相机。项目从设计芯片外围电路到使用FPGA采集数据,再到用以太网传输数据,最后到对数据处理可视化,本人独立负责整个架构设计与实现。二、项目架构以数据流向展示整体架构,具......
  • Tabular Value-Based Reinforcement Learning
    ReadingNotesaboutthebookDeepReinforcementLearningwrittenbyAskePlaatRecently,IhavebeenreadingthebookDeepReinforcementLearningwrittenbyAskePlaat.ThisbookisagoodintroductiontothetheoryofDeepReinforcementLearning.Andit......
  • Markov Decision Process Model Based on Value Iteration
    TheoriesMarkovDecisionProcessGenerally,wenotesaMDPmodelas\((S,A,T_a,R_a,\gamma)\).Itstransitionfunctionis\(T_a(s,s')=\Pr(s_{t+1}|s_t=s,a_t=a)\),rewardfunctionis\(R_a(s,s')\).Andactionschoosingsatisfiesaspec......
  • Signal Filters Design Based on Digital Signal Processing
    ThoeriesI.FourierSeriesExpansionAlgorithmWecanutilizetheFourierSeriestoproducetheanalogsignalwithsomefrequencycomponents.Foranysignal,itsFourierseriesexpansionisdefinedas\[x(t)=\frac{A_0}{2}+\sum_{n=1}^{\infty}A_n\cos......
  • Python reversed函数及用法
    reserved()是Pyton内置函数之一,其功能是对于给定的序列(包括列表、元组、字符串以及range(n)区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。reserved()函数的语法格式如下:reversed(seq)其中,seq可以是列表,元素,字符串以及range()生成的区间列表。下面程......
  • 'main' attribute cannot be used in a module that contains top-level code 问题解
    核心是@main注解在main.swift文件中,可以重新命名下参考资料https://stackoverflow.com/questions/73431031/swift-cli-app-main-attribute-cannot-be-used-in-a-module-that-contains-top-leve......
  • APP渗透--magisk+LSPosed+算法助手环境安装
    安装mgisk1、先安装app-debug.apk首先设置好模拟器的设置设置为可写入开启root之后重启安装app-debug.apk然后点开这个面具给root权限点击安装勾选这个选项之后就重启然后点开面具之后点击下一步必须看到安装到系统分区之后点击开始等待安装直到这里出现alldon......