2009-08-07 12 views
8

Tengo un gran archivo SQL que se ejecuta en el servidor. El volcado es de mi máquina y en él hay algunas configuraciones relacionadas con mi máquina. Entonces, básicamente, quiero que cada ocurrencia de "c://temp" sea reemplazada por "//home//some//blah"Comando de Linux para reemplazar cadena en archivo LARGE con otra cadena

¿Cómo se puede hacer esto desde la línea de comando?

+0

Usted se echa en falta un% arrastra en su comando. Es% foo% bar% no s% foo% bar –

Respuesta

29

sed es una buena opción para archivos de gran tamaño.

sed -i.bak -e 's%C://temp%//home//some//blah%' large_file.sql 

Es una buena opción porque no lee todo el archivo a la vez para cambiarlo. Citando el manual:

Un editor de flujo se utiliza para realizar transformaciones de texto básicos en una flujo de entrada (un archivo o entrada de una tubería ). Si bien de alguna manera es similar a un editor que permite ediciones con script (como ed), sed funciona por haciendo solo una pasada sobre la (s) entrada (s) , y por lo tanto es más eficiente. Pero es la capacidad de sed de texto de filtro en una tubería que particularmente lo distingue de otros tipos de editores.

La sección correspondiente del manual es here. Una pequeña explicación sigue

-i.bak permite la edición de artículos lugar dejando una copia de seguridad con la extensión .bak

s foo%%% Indicaciones barra de s, el comando de sustitución, que sustitutos partidos de primera cadena entre el signo%, 'foo', para la segunda cadena , 'barra'. Por lo general, se escribe como s // pero como sus cadenas tienen muchas de barras diagonales, es más conveniente que las cambie por otra cosa para que evite tener que escapar de ellas.

Ejemplo

 
[email protected]:~$ sed -i.bak -e 's%C://temp%//home//some//blah%' a.txt 
[email protected]:~$ more a.txt 
//home//some//blah 
D://temp 
//home//some//blah 
D://temp 
[email protected]:~$ more a.txt.bak 
C://temp 
D://temp 
C://temp 
D://temp 
+2

Puede usar un carácter diferente para evitar tener que citar las barras, por ejemplo sed -e "s% C: // temp%/home // algo // paja%". Además, la opción -i le permite guardar el archivo en su lugar, cuando esté seguro de las opciones. – dalloliogm

+0

Este es el comando que estoy escribiendo: sed -i.bak -e% C: \\ temp \%/home/liveon/public_html/tmp 'liveon.sql y este es el error que estoy obteniendo: sed: -e expresión # 1, char 41: comando 's 'no terminado ¿Alguien? – coderama

+0

Falta el% final, el comando es% foo% bar% –

1

El comando sed puede hacer eso. En lugar de escapar de las barras, se puede elegir un delimitador diferente (_ en este caso):

sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt 
+0

te perdiste el último guión bajo: "s_c: // temp/_/home // algunos // blah_" – dalloliogm

+0

gracias! Ahora está arreglado. – stefanw

4

Trate sed? Algo así como:

sed 's/c:\/\/temp/\/\/home\/\/some\/\/blah/' mydump.sql > fixeddump.sql 

escapar de todas esas barras hace que este aspecto horrible, sin embargo, aquí está un ejemplo más simple que cambia a foo bar.

sed 's/foo/bar/' mydump.sql > fixeddump.sql 

Como otros han señalado, puede elegir su propio delimitador, lo que impediría la leaning toothpick syndrome en este caso:

sed 's|c://temp\\|home//some//blah|' mydump.sql > fixeddump.sql 

Lo inteligente acerca de sed es que operan en una corrientevez que un archivo de una sola vez, por lo que puede procesar archivos de gran tamaño utilizando solo una cantidad modesta de memoria.

+0

Gracias Paul! Intellij Idea se vuelve loca y lo hace durante decenas de minutos, mientras que con sed solo lleva 1 segundo reemplazar la barra diagonal inversa con doble barra invertida en mi archivo sql. – gumkins

12

Solo para completar. Reemplazo en lugar usando perl.

perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp 

No se requieren escapes inversos tampoco. ;)

+10

Tenga en cuenta que si utiliza el indicador '-i' sin una extensión, obtiene * sin copia de seguridad *. Si desea una copia de seguridad, intente '-i.bak', que hará la edición in situ * y * le dará una copia de seguridad del original como' original.bak', casi gratis. – Telemachus

+0

Dejo que mi sistema de control de versiones se encargue de hacer las copias de seguridad. – jrockway

+3

@Jrockway: eso es encantador para usted, estoy seguro, pero asume que los archivos en cuestión están bajo control de versiones y que usted sabe lo que -i.bak hace y ha elegido no usarlo. Solo deseo que las personas que recomiendan el modificador -i tarden dos segundos para explicar la diferencia entre -i y -i.bak. Realmente va a doler si los archivos con los que juegas no están bajo control de versión y haces un simple error tipográfico (por ejemplo, olvídate del indicador -p). – Telemachus

3

También hay una utilidad no estándar UNIX, rpl, que hace exactamente lo mismo que los ejemplos sed hacen; sin embargo, no estoy seguro de si rpl funciona de forma continua, por lo que sed puede ser la mejor opción aquí.

+0

Heh, por casualidad, ¿eres amigo del desarrollador de rpl?:-) –

+0

No, nunca he oído hablar del tipo fuera del utilitario; resultó útil para hacer un trabajo de reemplazo de lotes en unos pocos miles de archivos de texto una vez y lo mantuve en mi caja de herramientas. –

+0

Valdría la pena decir * por qué * lo recomienda en este caso (o por qué podría hacerlo, ya que retiró la recomendación). Es decir, en lugar de solo arrojar el nombre de una utilidad, cuéntenos qué le gustó, por favor. – Telemachus

1
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename 

El -p tratará este script como un bucle, se leerá la línea de archivo especificado por línea que la búsqueda de expresiones regulares y reemplazar.

-i Esta bandera debe usarse junto con el distintivo -p. Esto ordena a Perl editar el archivo en su lugar.

-e Solo significa ejecutar este código perl.

Buena suerte

+0

gracias por la explicación –

1

gawk

awk '{gsub("c://temp","//home//some//blah")}1' file 
Cuestiones relacionadas