2010-10-20 8 views
20

Tengo un script que llama a grep para procesar un archivo de texto. Actualmente estoy haciendo algo como esto.Procesamiento in situ con grep

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp 
$ mv myfile.txt.temp myfile.txt 

Me pregunto si hay alguna manera de hacer el proceso en el lugar, como en la tienda de los resultados en el mismo archivo original sin tener que crear un archivo temporal y luego vuelva a colocar el original con el archivo temporal cuando el procesamiento está hecho.

Por supuesto, doy la bienvenida a los comentarios sobre por qué esto debería o no debería hacerse, pero estoy interesado principalmente en si se puede hacer. En este ejemplo, estoy usando grep, pero estoy interesado en las herramientas de Unix en general. ¡Gracias!

Respuesta

12

Perl tiene el interruptor -i, también lo hace sed y Ruby

sed -i.bak -n '/SomeRegex/p' file 

ruby -i.bak -ne 'print if /SomeRegex/' file 

Pero tenga en cuenta que todo lo que hace es crear archivos "temporales" en la parte posterior que cree que no ve, eso es todo.

otras formas, además de grep

awk

awk '/someRegex/' file > t && mv t file 

fiesta

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file 
+0

¿Cómo los ejemplos awk y golpe mejorar en el grep original, que no sea '' && en lugar de ' ; '? Estos aún crean explícitamente un archivo temporal. –

2

No, en general no se puede hacer así en Unix. Solo puede crear/truncar (con>) o agregar a un archivo (con >>). Una vez truncado, los viejos contenidos se perderían.

3

En general, esto no se puede hacer. Pero Perl tiene el interruptor -i:

perl -i -ne 'print if /SomeRegEx/' myfile.txt 

Escribir -i.bak hará que el original se salve en la myfile.txt.bak.

(Por supuesto internamente, Perl sólo lo hace básicamente lo que ya está haciendo -. No hay magia especial involucrados)

+2

lo tiene mientras yo estaba buscando hasta que - 1 para su velocidad –

0

La mayoría de las instalaciones de sed pueden hacer una edición in situ, revise la página de manual, probablemente desee la bandera -i.

0

Para editar archivos en el lugar usando vim-manera, tratar:

$ ex -s +'%!grep foo' -cxa myfile.txt 

Como alternativa, utilice sed o gawk.

11

sponge (en el paquete moreutils en Debian/Ubuntu) lee la entrada hasta EOF y la escribe en un archivo, por lo que puede grep archivo y escribir de nuevo a sí mismo.

De esta manera:

grep 'pattern' file | sponge file 
Cuestiones relacionadas