2011-06-26 17 views
5

Quiero leer el archivo "teste", hacer "buscar & reemplazar" y sobrescribir "teste" con los resultados. Cuanto más me acercaba hasta ahora es:Sustitución de texto (lectura del archivo y guardado en el mismo archivo) en Linux con sed

$cat teste 
I have to find something 
This is hard to find... 
Find it wright now! 

$sed -n 's/find/replace/w teste1' teste 

$cat teste1 
I have to replace something 
This is hard to replace... 

si trato de guardar en el mismo archivo de esta manera:

$sed -n 's/find/replace/w teste' teste 

o:

$sed -n 's/find/replace/' teste > teste 

El resultado será un archivo en blanco ...

Sé que me estoy perdiendo algo muy estúpido, pero cualquier ayuda será bienvenida.


ACTUALIZACIÓN: En base a los consejos que se dan por la gente y este enlace: http://idolinux.blogspot.com/2008/08/sed-in-place-edit.html aquí está mi código actualizado:

sed -i -e 's/find/replace/g' teste 

Respuesta

17

En Linux, sed -i es el camino a seguir. sed en realidad no está diseñado para la edición in situ; Históricamente, es un filtro, un programa que edita una secuencia de datos en una tubería, y para este uso necesitaría escribir en un archivo temporal y luego cambiarle el nombre.

La razón por la que obtiene un archivo vacío es porque el shell abre (y trunca) el archivo antes de ejecutar el comando.

+0

Muchas gracias. ¿Sería "ed" más apropiado para editar en lugar de "sed"? – Roger

+0

Sí y no; 'ed' es mejor para la edición in situ pero no es muy conveniente para su uso en scripts, por lo que' sed' ha crecido una opción no estándar (por POSIX) '-i'. – geekosaur

+0

Por lo tanto, para la edición in situ de buscar y reemplazar, lo mejor en Linux es "sed". ¿Es correcto decir eso? – Roger

1

Usted desea utilizar "sed -i". Esto actualiza en su lugar.

2

que desee: sed -i 's/foo/bar/g' file

1

edición en contexto con el Perl

perl -pi -w -e 's/foo/bar/g;' file.txt 

o

perl -pi -w -e 's/foo/bar/g;' files* 

para muchos archivos

0

La solución es ed:

ed teste <<END 
1,$s/find/replace/g 
w 
q 
END 

o sin la heredoc

printf "%s\n" '1,$s/find/replace/g' w q | ed teste 
Cuestiones relacionadas