macos file-io sed in-place

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