¿Cómo puedo obtener mi comando sed para hacer cambios permanentes en un archivo?

32

es posible? Leí en alguna parte que el siguiente comando lo haría:

sed -e [comando] [archivo]

pero parecía hacer lo mismo que solo

sed [comando] [archivo]

(no guardó los cambios). ¿Hay alguna manera de hacer esto usando sed?

John
fuente
2
La -ebandera significa expresión. Probablemente quieras la -ibandera que significa in-placey te recomiendo que uses sed -i.bak 's/../' filename
Valentin Bajrami

Respuestas:

50

Creo que estás buscando -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Por ejemplo:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Si proporciona un sufijo, creará un archivo de copia de seguridad:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

El archivo de entrada se modifica y se crea una copia de seguridad que contiene los datos del archivo original.

También tenga en cuenta que esto es para GNU sed, hay ligeras diferencias en el formato entre diferentes sedimplementaciones.

terdon
fuente
44
Tenga en cuenta que la página del manual es incorrecta. sedno hace edición en el lugar. Crea un nuevo archivo y sobrescribe el antiguo, el inodo cambia.
Marco
2
@Marco Esa es la forma segura de editar un archivo en su lugar. “Editar un archivo en el lugar” en la documentación de sed significa que el archivo original (como se define por su nombre) se modifica, no que se modifica el archivo original (según se define por su inodo).
Gilles 'SO- deja de ser malvado'
2
@Gilles Estoy totalmente de acuerdo en que esta es la forma preferida de editar un archivo, pero difícilmente lo llamaría en su lugar . Pero eso se reduce a la cuestión de cómo se identifica un archivo, por inodo o por nombre. Yo diría por inodo, de lo contrario, construcciones como { rm file; cmd > file; } < filellevaría a la conclusión de que cmd lee y escribe en el mismo archivo, lo que no hace. Son dos archivos de distinción que tienen el mismo nombre. Pero no quiero comenzar una discusión aquí.
Marco
En macOS 10.14 me sale sed: 1: "foo.txt": invalid command code fcuando se ejecuta sed -i 's/o/X/g' foo.txt. Sin embargo, proporcionar una extensión, como sed -i .bak 's/o/X/g' foo.txtfunciona bien. ¿Alguna idea de cómo hacer que funcione sin crear archivos de copia de seguridad?
Joshua Pinter el
1
De acuerdo, lo descubrí. En macOS, debe agregar explícitamente una cadena vacía para la opción de parámetro de extensión:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter el
2

Esta solución funciona para HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2) perl -pi -e 's/Error/NO_Error/g' test1.sh

3) sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

usuario3114790
fuente
No puede usar tee askubuntu.com/a/752451
Steven Penny
1

-ela opción es para ejecutar múltiples sedcomandos

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

considerar file.txtcomo

linux os

entonces O / P es

unix os

-i la opción guarda los cambios de forma permanente ...

usuario195318
fuente