中易网

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

答案:1  悬赏:40  
解决时间 2021-01-16 10:59
  • 提问者网友:浩歌待明月
  • 2021-01-16 02:50
Linux Shell中,sed重定向到文件自身的原理。
最佳答案
  • 二级知识专家网友:轮獄道
  • 2021-01-16 04:11
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在执行的过程中会失败,这也是我第一次追问时的现象。
非常感谢您的思路!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息