sed 重定向本文件结果清空了文件

问题描述

今天写脚本处理脚本文件的变量,需要将其中的一个变量(这里举例为replaceStr)替换成另一个变量。于是写出了形如这样的一段代码:

sed 's~replaceStr~replacedStr~g' replaceFile > replaceFile

当然这里具体的工作环境被代替了。实际替换了好多个脚本中的内容。
执行之后发现所有的被替换的脚本内容都清空了。只好再重写一遍。

问题解决

这个问题是由于重定向导致的。所以这里我的处理方案是增加了一个tmp文件。写成了形如:

sed 's~replaceStr~replacedStr~g' replaceFile > tmpFile
mv tmpFile replaceFile

的形式。就可以解决这个问题了。

或者只要不重定向到本身就好了。可以用如下方法来解决:

sed 's~replaceStr~replacedStr~g' replaceFile | tee replaceFile > /dev/null

将输出重定向给tee命令来修改文件。这样就能避免问题了。

相关原理

这里用到了I/O重定向相关的内容。这是我关于I/O重定向的一些了解。

但是其实漏掉了这部分内容。于是在网上找到了这样的一篇文章shell 十三問

里面对于重定向相关的内容很好的解决了这个问题。

这个问题的实质其实很简单,就是由于重定向的时候要先准备好输入输出然后才进行读写操作,所以在sed读取replaceFile中的内容之前,已经由于>操作将这个文件中的内容都清空了。所以最后得到了几个被删光的文件。

    原文作者:Fengya
    原文地址: https://www.jianshu.com/p/5d098768e5cf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞