Confusión sobre sed y '>'

El siguiente command funciona bien:

sed s/input/raw_input/ p.py >p2.py && mv p2.py p.py 

Sin embargo, el siguiente command convierte p.py en un file vacío:

 sed s/input/raw_input/ p.py >p.py 

Lo siguiente también convierte p.py en un file vacío:

 sed s/input/raw_input/ p.py | cat > p.py 

¿Por qué los dos últimos commands no se comportan como se esperaba? En particular, ¿por qué p.py está vacío?

Esto se debe a que se llama al operador de networkingirección > antes de cualquier command y, por lo tanto, sucede lo siguiente en este order:

  1. p.py se abre para escribir, truncando lo que haya antes
  2. sed es llamado para ejecutar commands en p.py que ahora está vacío
  3. La salida (que no es nada) se escribe en p.py (por lo que todavía no contiene nada)

Tiene dos opciones dependiendo de qué tan portátil desee que sea su código:

no portátil

Use la opción GNU sed -i para hacer una edición in situ

portátil

networkingirigir el resultado a un file temporal y luego mover el file temporal sobre el original después de completar sed