Linux Shell中,sed重定向到文件自身的原理。

$ cat data.txt
This is the header line.
$ sed '/header/i\New line.' data.txt > data.txt
$ cat data.txt
$

请问:最后为什么data.txt的文件为空?是文件的指针引发这一现象,还是Shell重新创建了一个data.txt空文件,或是其他原因?请详细说明理由!解答得越详细越好!非常感谢!

Shell的原因,用>重定向  到输入文件,会先把文件清空,

和sed无关,awk、cat等都可以试试,也是空文件比如:

cat data.txt >data.txt       #也是得到空文件

> 文件名

文件名不存在,先新建;文件名存在,先清空——这一部分先执行。

追问

您好,非常感谢您的回答。这解答我一半的疑问,但是我还有另一半:P,望帮忙详细解答。
既然是重定向导致的清空data.txt文件,那么我在文件的末尾进行追加时:
$ sed '$a\Last line.' data.txt > data.txt
此时,为什么sed还是会失败?我只知道sed是一款stream editor,还请告知原因及相关原理。

追答

别重定向到输入文件,去掉这个,咱们再解释其他疑问。
sed更改输入文件可以用-i选项

试了半天,发现sed处理空文件,代码不会执行

因为它读取成功时才执行,一行一行地处理。空文件读取失败,一次也不会执行

awk的END中输出,可以有结果

awk中,输入文件虽然被清空,但END部分总会执行;sed中的代码就像是在while(readline){代码}一样,前面的条件处理空文件时直接返回假,代码不执行,所以插入失败。这样讲应该能理解吧

追问

其实,我在追问的时候我自己就已经试过了,向空文件Append的结果就是失败的。但我想深究其内部原因,也想得到更彻底、明确、清晰的回答。
我理解的思路是这样的,可能和您不同(勿怪):因为sed是一款流编辑器(Stream Editor),既然input是一个空文件,就无法谈及input中的数据流,因为其input就是空!所以,sed在执行的过程中会失败,这也是我第一次追问时的现象。
非常感谢您的思路!

温馨提示:答案为网友推荐,仅供参考
相似回答