2011-09-27 8 views
93

me gustaría editar un archivo con sed en OS X. Estoy usando el siguiente comando:en el lugar ediciones con sed en OS X

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?

He intentado con la bandera -i. Esto da como resultado el siguiente error:

sed: 1: "file1.txt": invalid command code f 
+2

¿Cuál es el comando exacto que está utilizando cuando intenta el indicador '-i'? – eldarerathis

Respuesta

191

Usted puede utilizar el indicador -i correctamente dotándolo de un sufijo que se agregará al archivo de copia de seguridad. La ampliación de su ejemplo:

sed -i.bu 's/oldword/newword/' file1.txt 

le dará dos archivos: uno con la file1.txt nombre que contiene la sustitución, y uno con el file1.txt.bu nombre que tiene el contenido original.

Ligeramente peligroso

Si desea destructivamente sobrescribir el archivo original, utilice algo como:

sed -i '' 's/oldword/newword/' file1.txt 
    ^note the space 

Debido a la forma de la línea se analiza, se requiere un espacio entre la bandera opción y su argumento porque el argumento es de longitud cero.

Aparte de posiblemente destrozar su original, no estoy al tanto de ningún peligro adicional de engañar a sed de esta manera. Sin embargo, se debe tener en cuenta que si esta invocación de sed es parte de un script, The Unix Way ™ (IMHO) debería usar sed de forma no destructiva, probar que salió limpiamente y solo luego eliminar el archivo extraño.

+0

Tiene razón, estaba omitiendo la extensión después de la bandera -i. ¿Es '-i''' peligroso por alguna otra razón que no sea potencialmente desordenar el archivo original (y no tener copia de seguridad)? – SundayMonday

+0

De acuerdo con la página del manual 'sed' si se queda sin espacio en disco en el dispositivo, podría dañar un archivo a mitad de camino y tener un resultado de salida incorrecto. Si está trabajando bajo el control de origen local 'sed -i" "' sin copias de seguridad debería estar bien la mayor parte del tiempo (o simplemente 'git init && git add -A. && git commit -m 'backup'' antes de ejecutar sed en modo '-i'). – cfeduke

+1

Encontré el bit ligeramente peligroso particularmente útil. +1 – Andre

12

tengo problema similar con MacOS

sed -i '' 's/oldword/newword/' file1.txt 

no hace obras, pero

sed -i"any_symbol" 's/oldword/newword/' file1.txt 

funciona bien.

2

Puede usar -i'' (--in-place) para sed como ya se ha sugerido. Consulte: The -i in-place argument; sin embargo, tenga en cuenta que la opción -i es extensiones de FreeBSD no estándar y es posible que no esté disponible en otros sistemas operativos. En segundo lugar sed is a Stream EDitor, not a file editor.


Una forma alternativa es utilizar la sustitución incorporado en el modo de Vim Ex, como:

$ ex +%s/foo/bar/g -scwq file.txt 

y para múltiples archivos:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.* 

Para editar todos los archivos de forma recursiva usted puede usar **/*.* si el shell admite eso (habilitar por shopt -s globstar).


Otra forma es utilizar gawk y su nuevo "inplace" extension tales como:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1