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
-e
bandera significa expresión. Probablemente quieras la-i
bandera que significain-place
y te recomiendo que usessed -i.bak 's/../' filename
Respuestas:
Creo que estás buscando
-i
:Por ejemplo:
Si proporciona un sufijo, creará un archivo de copia de seguridad:
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 diferentessed
implementaciones.fuente
sed
no hace edición en el lugar. Crea un nuevo archivo y sobrescribe el antiguo, el inodo cambia.{ rm file; cmd > file; } < file
llevarí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í.sed: 1: "foo.txt": invalid command code f
cuando se ejecutased -i 's/o/X/g' foo.txt
. Sin embargo, proporcionar una extensión, comosed -i .bak 's/o/X/g' foo.txt
funciona bien. ¿Alguna idea de cómo hacer que funcione sin crear archivos de copia de seguridad?sed -i '' 's/o/X/g' foo.txt
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
fuente
-e
la opción es para ejecutar múltiplessed
comandosconsiderar
file.txt
comoentonces O / P es
-i
la opción guarda los cambios de forma permanente ...fuente