2011-07-22 16 views
16

¿Cuál sería el comando sed para mac shell scripting que reemplazaría todas las iteraciones de la cadena "fox" con todo el contenido de la cadena de myFile.txt?Usa el contenido de un archivo para reemplazar una cadena usando SED

myFile.txt sería contenido html con saltos de línea y todo tipo de caracteres. Un ejemplo sería

</div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 

Gracias!

EDIT 1

Este es mi código real:

sed -i.bkp '/Q/{ 
s/Q//g 
r /Users/ericbrotto/Desktop/question.txt 
}' $file 

Cuando lo ejecuto me sale:

sed in place editing only works for regular files. 

Y en mis archivos de la Q se sustituye por una tonelada de caracteres chinos (!). ¡Extraño!

+0

Ver http://stackoverflow.com/questions/6684487/sed-replace-with-variable-with-multiple-lines/6685563#6685563. Esta sería una solución. Buena suerte. – shellter

+0

Acerca de Edit 1 ... Sus archivos originales están disponibles con la extensión '.bkp'. ¿Cuál es el contenido de su archivo 'question.txt'? Además, ¿cuál es el contenido de los archivos a los que hace referencia '$ file'.¿Hay algún archivo binario? ¿Cuál es la codificación de ellos? – brandizzi

+0

El contenido del archivo question.txt es exactamente el html que se muestra arriba. Los archivos a los que hace referencia el archivo $ son archivos .txt. ¿Hay algún problema con mi parte de .bkp? ¿Debo cambiarlo a .txt? Comprobaré la codificación de mi archivo question.txt ahora. –

Respuesta

40

Puede usar el comando r. Cuando encuentre un 'zorro' en la entrada ...

/fox/{ 

... sustituirla por nada ...

s/fox//g 

... y leer el archivo de entrada:

r f.html 
} 

Si usted tiene un archivo como:

$ cat file.txt 
the 
quick 
brown 
fox 
jumps 
over 
the lazy dog 
fox dog 

el resultado es:

$ sed '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 
the 
quick 
brown 

    </div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 
jumps 
over 
the lazy dog 
dog 
    </div> 
    </div> 
    <br> 
    <div id="container2"> 
    <div class="question" onclick="javascript:show('answer2')";> 

EDITAR: para alterar el archivo que se está procesando, sólo tiene que pasar la bandera -i de sed:

sed -i '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 

Algunas versiones de sed (como mi propio uno) que tenga que pasar una extensión a la bandera -i, que será la extensión de un archivo de copia de seguridad con el antiguo contenido del archivo:

sed -i.bkp '/fox/{ 
    s/fox//g 
    r f.html 
}' file.txt 

Y aquí es lo mismo que un chiste, que también es compatible con Makefile

sed -i -e '/fox/{r f.html' -e 'd}' 
+0

¡Esto funciona totalmente! ¡Dale a este hombre la medalla de honor! Una última cosa, Brandizzi ... esto es imprimir en la consola, pero no en el archivo. ¿Podríamos obtener un poco de código para hacer eso? ¡Un millón de gracias! –

+0

¡Claro que puedes! He editado mi respuesta. – brandizzi

+0

Brandizzi. Obteniendo un comportamiento extraño. ¿Podría verificar mi Edit 1? –

2

En última instancia lo que pasé con el que es mucho más simple que una gran cantidad de soluciones que encontré en línea:

str=xxxx 
sed -e "/$str/r FileB" -e "/$str/d" FileA 

Soporta plantillas de este modo:

str=xxxx 
sed -e "/$str/r $fileToInsert" -e "/$str/d" $fileToModify 
+0

Esto realmente funciona. –

+1

esto no funciona en caso de que el str emparejado no esté todo en una sola línea. Esto reemplazaría toda la línea con los contenidos de fileToInsert incluso si una parte de la cadena coincide – saGii

Cuestiones relacionadas