No deberías usar sed para eso. Esta pregunta parece surgir ridículamente a menudo, y parece muy extraño que sí, ya que la solución general es tan trivial, parece extraño que la gente quiera saber cómo hacerlo en sed, y en python, y en ruby, etc. . Si usted quiere tener un filtro de operar en una entrada y sobrescribir, utilice la siguiente secuencia de comandos simple:
#!/bin/sh -e
in=${1?No input file specified}
mv $in ${bak=.$in.bak}
shift
"[email protected]" < $bak > $in
poner esto en tu camino en un nombre de archivo ejecutable inline
, y entonces el problema se resuelve en general. Por ejemplo:
inline input-file sed -e s/foo/bar/g
Ahora, si quieres añadir lógica para mantener múltiples copias de seguridad, o si usted tiene algunas opciones para cambiar el esquema de denominación de copia de seguridad, o lo que sea, podría solucionar esto en un solo lugar. ¿Cuál es la opción de línea de comando para obtener contadores de 1 en el archivo de copia de seguridad cuando se procesa un archivo en el lugar con perl
? ¿Qué tal con ruby
? ¿La opción es diferente para gnu-sed
? ¿Cómo lo maneja awk
? Todo el maldito punto de Unix es que las herramientas hacen una sola cosa. La lógica de manejo para los archivos de respaldo es una segunda cosa y debe ser eliminada. Si está implementando una herramienta, no agregue lógica para crear archivos de respaldo. Dile a tus usuarios que utilicen una segunda herramienta para eso. La integración es mala. La modularidad es buena. Esa es la forma de Unix.
Observe que este script tiene varios problemas.Los permisos/modo del archivo de entrada pueden cambiarse, por ejemplo. Estoy seguro de que hay innumerables otros problemas. Sin embargo, al colocar la lógica de la copia de seguridad en una secuencia de comandos contenedora, localiza todos estos problemas y no tiene que preocuparse de que sed
sobrescriba los archivos y cambie el modo, mientras que python
mantiene el archivo en su lugar y no cambia el inode (lo hice esos dos casos, el punto es que no todas las herramientas a utilizar la misma lógica, mientras que el guión envoltorio lo hará.)
sed -ES/some1/some2/g input.file> output.file; output.file mv input.file – 0xAX