macos - Ediciones en el lugar con sed en OS X
file-io in-place (4)
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 a la 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 archivo1.txt . ¿Cómo puedo hacer esto?
Probé la bandera -i. Esto produce el siguiente error:
sed: 1: "file1.txt": invalid command code f
Puede usar -i''''
( --in-place
) para sed
como ya se sugirió. Consulte: el argumento -i
in-place ; sin embargo, tenga en cuenta que la opción -i
no es una extensión estándar de FreeBSD y puede que no esté disponible en otros sistemas operativos. En segundo lugar, sed
es un S tream ED itor, no un editor de archivos .
Otra forma es utilizar la sustitución incorporada en el modo Vim Ex, como:
$ ex +%s/foo/bar/g -scwq file.txt
y para archivos múltiples:
$ ex +''bufdo!%s/foo/bar/g'' -scxa *.*
Para editar todos los archivos recursivamente, puede usar **/*.*
Si el shell lo admite (enable by shopt -s globstar
).
Otra forma es utilizar gawk
y su nueva extensión "en el lugar" , como:
$ gawk -i inplace ''{ gsub(/foo/, "bar") }; { print }'' file1
Puede usar el distintivo -i correctamente proporcionándole un sufijo para agregar al archivo respaldado. Extendiendo tu ejemplo:
sed -i.bu ''s/oldword/newword/'' file1.txt
Le dará dos archivos: uno con el nombre archivo1.txt que contiene la sustitución y otro con el nombre archivo1.txt.bu que tiene el contenido original.
Levemente 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 es de longitud cero.
Además de posiblemente destrozar tu original, no estoy al tanto de ningún peligro adicional de engañar a sed de esta manera. Cabe señalar, sin embargo, que si esta invocación de sed
es parte de una secuencia de comandos, The Unix Way ™ sería (en mi humilde opinión) utilizar sed
no destructiva, probar que salió limpiamente, y solo luego eliminar el archivo extraño.
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