Ediciones in situ con sed en OS X
Me gustaría editar un archivo con sed en OS X. Estoy usando el siguiente comando:
sed 's/oldword/newword/' file.txt
La salida se envía al terminal. file.txt no se modifica. Los cambios se guardan en file2.txt con este comando:
sed 's/oldword/newword/' file1.txt > file2.txt
Sin embargo, no quiero otro archivo. Solo quiero editar file1.txt . ¿Cómo puedo hacer esto?
Probé el indicador -i. Esto da como resultado el siguiente error:
sed: 1: "file1.txt": invalid command code f
Puede utilizar la -i
bandera correctamente proporcionándole un sufijo para agregar al archivo respaldado. Ampliando su ejemplo:
sed -i.bu 's/oldword/newword/' file1.txt
Le dará dos archivos: uno con el nombre file1.txt
que contiene la sustitución y otro con el nombre file1.txt.bu
que tiene el contenido original.
Ligeramente peligroso
Si desea sobrescribir destructivamente el archivo original, use algo como:
sed -i '' 's/oldword/newword/' file1.txt
^ note the space
Debido a la forma en que se analiza la línea, se requiere un espacio entre el indicador de opción y su argumento porque el argumento tiene longitud cero.
Aparte de la posibilidad de destrozar el original, no conozco ningún peligro adicional de engañar a sed de esta manera. Sin embargo, debe tenerse en cuenta que si esta invocación sed
es parte de un script, The Unix Way™ sería (en mi humilde opinión) utilizarlo sed
de forma no destructiva, probar que salió limpiamente y solo entonces eliminar el archivo superfluo.
La -i
bandera probablemente no funcione para usted, porque siguió un ejemplo para GNU sed mientras que macOS usa BSD sed y tienen una sintaxis ligeramente diferente.
Todas las demás respuestas le indican cómo corregir la sintaxis para que funcione con BSD sed. La alternativa es instalar GNU sed en tu macOS con:
brew install gsed
y luego úselo en lugar de la sed
versión enviada con macOS (tenga en cuenta el g
prefijo), por ejemplo:
gsed -i 's/oldword/newword/' file1.txt
Si desea que los comandos GNU sed sean siempre portátiles para su macOS, puede anteponer el directorio "gnubin" a su ruta, agregando algo como esto a su archivo .bashrc
/ .zshrc
(ejecute brew info gsed
para ver qué debe hacer exactamente):
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
y a partir de ese momento, el sed GNU se convierte en su sed predeterminado y simplemente puede ejecutar:
sed -i 's/oldword/newword/' file1.txt
Tengo un problema similar con MacOS.
sed -i '' 's/oldword/newword/' file1.txt
no funciona, pero
sed -i"any_symbol" 's/oldword/newword/' file1.txt
funciona bien.
sed -i -- "s/https/http/g" file.txt