关于 sed 和 '>' 的混淆

关于 sed 和 '>' 的混淆

以下命令工作正常:

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

这是因为重定向运算符>在任何命令之前被调用,因此以下顺序会发生:

  1. p.py打开以进行写入,截断之前的所有内容
  2. sed被调用以执行p.py现在为空的命令
  3. 输出(什么也没有)被写入p.py(所以它仍然不包含任何内容)

根据您希望代码的可移植性,您有两种选择:

不便携

使用 GNUsed -i选项进行就地编辑

便携的

将输出重定向到临时文件,然后在sed完成后将临时文件移到原始文件上

相关内容