top running name unix grep in-place

unix - running - ssh find process name



Procesamiento in situ con grep (8)

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

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

Me pregunto si hay alguna forma de realizar un procesamiento en el lugar, ya que al almacenar los resultados en el mismo archivo original sin tener que crear un archivo temporal y luego reemplazar el original con el archivo temporal cuando se realiza el procesamiento.

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


Almacenar en una variable y luego asignarlo al archivo original:

A=$(cat aux.log | grep ''Something'') && echo "${A}" > aux.log


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 guarde en myfile.txt.bak .

(Por supuesto, internamente, Perl simplemente hace lo que ya estás haciendo, no implica ninguna magia especial).


La mayoría de las instalaciones de sed pueden hacer ediciones en el lugar, verifique la página del manual, es probable que desee la -i .


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


Para editar un archivo in situ usando vim-way, intente:

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

Alternativamente, utilice sed o gawk .


Perl tiene el interruptor -i , así como 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 el extremo posterior que cree que no ve, eso es todo.

Otras formas, además de grep

awk

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

golpetazo

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



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

Me gusta esto:

grep ''pattern'' file | sponge file