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

这篇具有很好参考价值的文章主要介绍了sed 原地替换文件时遇到的趣事。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

在文章《三剑客之 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 文件
sed 原地替换文件时遇到的趣事

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

如果我们对软链接文件内容进行修改,源文件是会跟着改变的
sed 原地替换文件时遇到的趣事
当我使用 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 原地替换文件时遇到的趣事
怎么样,是不是很神奇?sed 不但把文件内容改了,还把文件属性也给改了

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

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

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

具体内容有点多,我们着重看下关键内容
sed 原地替换文件时遇到的趣事
由上图可以知道,如果我们使用 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 原地替换文件时遇到的趣事
总结一下:文章来源地址https://www.toymoban.com/news/detail-741824.html

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

到了这里,关于sed 原地替换文件时遇到的趣事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sed中使用正则表达式进行替换以及注意事项

    sed中使用正则表达式进行替换的时候,一定要注意,有些特殊字符在使用时要转义,目前发现的有: 用于分组的小括号:(),在使用时要用进行转义,但是匹配字符串中真正的小括号时,无需转义; 表示前面的表达式出现次数的{},也要转义; 表示前面的表达式出现1次或多

    2023年04月22日
    浏览(44)
  • Linux CentOS7sed的替换及逆转功能

    在各项工作中,需要大量的文本处理。有时,想把文件按行翻转一下,最后一行显示在第一行,倒数第二行显示在正数第二行,等等。这是对行的逆转要求,可以通过命令tac对文件操作,达到目的;有时,想把一行内容按单词翻转一下,最后一个单词显示第一个位置,倒数第

    2024年02月10日
    浏览(55)
  • 记录一次最近遇到的新网络诈骗经历,大家要提高警惕啊

    第一次接到诈骗电话,说是要求修改支付宝信息的,一开始说的确实是很迷惑人,一下子可能没法马上分辨出来,但是到后面说要加QQ操作什么什么的,那肯定就是有严重问题的,因为很多诈骗都是通过QQ来操作的,一听到这个就要警惕了。 他的诈骗流程是这样的: 先是说你

    2023年04月23日
    浏览(44)
  • linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行

    linux常用命令(9):sed命令(编辑/替换/删除文本) linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行 linux sed批量修改替换文件中的内容/sed特殊字符 本文主要讲解如何删除txt文件中的某一行内容,sed命令更多详细内容参考《linux常用命令(9):sed命令(编辑/替换/删除文本

    2024年01月21日
    浏览(47)
  • shell读取配置文件-sed命令

    在编写启动脚本时,涉及到读取配置文件,特地记录下shell脚本读取启动文件的方式。主要提供两种格式的读取方式,方式一配置文件采用“[]”进行分区,方式二配置文件中需要有唯一的配置项名称。 配置文件格式如下: # cat -n config.ini 1 #MYSQL配置项 2 [MYSQL] 3 DB_HOST=192.168.

    2023年04月11日
    浏览(40)
  • 使用 sed 命令删除 Linux 文件中的行

    在 Linux 系统中,sed(流编辑器)是一个功能强大的命令行工具,它可以用于对文本文件进行处理和转换。其中一个常见的用途是删除文件中的特定行。本文将介绍如何使用 sed 命令删除文件中的行,并提供相应的源代码示例。 要使用 sed 命令删除文件中的行,可以使用以下的

    2024年02月04日
    浏览(48)
  • 进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持

    C++的编程精华,走过路过千万不要错过啊!废话少说,我们直接进入正题!!!! 函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的。 语法 : 返回值类型 函数名 (参数 = 默认值){} 示例 : 函数占位参数 C++中函数的形参列表里可以有占位参教,用来做占位

    2023年04月17日
    浏览(57)
  • Unity图片导入趣事随笔

    像这样的png格式的图片,直接导入unity时unity会把没有像素的部分用黑色填充,并根据填充部分自动生成alpha通道。看起来alpha通道是不能手动覆盖的,即使在ps中手动添加一个alpha通道,并添加覆盖值。 导出后也会发现这没有任何意义,在unity中查看alpha通道依旧和以前一致。

    2024年01月21日
    浏览(48)
  • 有关 python 切片的趣事

    哈喽大家好,我是咸鱼 今天来讲一个我在实现 python 列表切片时遇到的趣事 在正式开始之前,我们先来了解一下 切片(slice) 切片操作是访问序列(列表、字符串......)中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列 语法如下

    2024年02月08日
    浏览(32)
  • 常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)

    1、第一个案例:helloworld 2、打印运行的python进程 3、获取并打印参数 4、用脚本写for循环 5、使用C语言风格的for命令 6、while循环案例 7、使用break跳出外部循环 8、使用continue命令 9、case案例 10、判断两个数是否相等 11、使用双圆括号 12、使用双方括号 13、反引号的使用 14、字

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包