以下命令工作正常:
sed s/input/raw_input/ p.py >p2.py && mv p2.py p.py
但是,以下命令将 p.py 转换为空文件:
sed s/input/raw_input/ p.py >p.py
以下还将 p.py 转换为空文件:
sed s/input/raw_input/ p.py | cat > p.py
为什么最后两个命令的行为不符合预期?特别是为什么 p.py 是空的?
答案1
这是因为重定向运算符>
在任何命令之前被调用,因此以下顺序会发生:
p.py
打开以进行写入,截断之前的所有内容sed
被调用以执行p.py
现在为空的命令- 输出(什么也没有)被写入
p.py
(所以它仍然不包含任何内容)
根据您希望代码的可移植性,您有两种选择:
不便携
使用 GNUsed -i
选项进行就地编辑
便携的
将输出重定向到临时文件,然后在sed
完成后将临时文件移到原始文件上