$ 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在执行的过程中会失败,这也是我第一次追问时的现象。
非常感谢您的思路!