¿Cuál es la forma más sencilla de buscar y reemplazar una cadena de entrada determinada, por ejemplo abc, y reemplazarla por otra cadena, por ejemplo, XYZen el archivo /tmp/file.txt?
Estoy escribiendo una aplicación y usando IronPython para ejecutar comandos a través de SSH, pero no conozco a Unix tan bien y no sé qué buscar.
He oído que Bash, además de ser una interfaz de línea de comandos, puede ser un lenguaje de script muy poderoso. Entonces, si esto es cierto, supongo que puede realizar acciones como estas.
¿Puedo hacerlo con bash, y cuál es el script más simple (una línea) para lograr mi objetivo?

sed:s/..../..../ - Substitutey/g - Globalinvalid command code Cerror ... Para los reemplazos en el lugar, BSDsedrequiere una extensión de archivo después de la-imarca porque guarda un archivo de respaldo con la extensión dada. Por ejemplo:sed -i '.bak' 's/find/replace/' /file.txtpuede omitir la copia de seguridad utilizando una cadena vacía como esta:sed -i '' 's/find/replace/' /file.txts/abc/XYZ/giLa manipulación de archivos normalmente no es realizada por Bash, sino por programas invocados por Bash, por ejemplo:
La
-ibandera le dice que haga un reemplazo en el lugar.Consulte
man perlrunpara obtener más detalles, incluido cómo realizar una copia de seguridad del archivo original.fuente
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text, pero sigo obteniendo un error con No tener espacio entre el patrón y la siguiente palabra está en desuso en la línea -e 1. No coincide (en expresiones regulares; marcado por <- AQUÍ en m / (chdir) () (<- AQUÍ ?: \\ / at -e línea 1.Me sorprendió cuando tropecé con esto ...
Hay un
replacecomando que se incluye con el"mysql-server"paquete, así que si lo ha instalado, pruébelo:Vea
man replacepara más sobre esto.fuente
replacees una herramienta útil e independiente y la gente de MySQL debería liberarla por separado y depender de ella b)replacerequiere un poco de MySQL o_O De cualquier manera, instalar mysql-server para reemplazarlo sería lo incorrecto. :)mysql-serverpaquete instalado. Como señaló @rayro,replacees parte de ello.Esta es una publicación antigua, pero para cualquiera que quiera usar variables como @centurian dijo que las comillas simples significan que nada se expandirá.
Una forma simple de obtener variables es hacer una concatenación de cadenas, ya que esto se hace por yuxtaposición en bash, lo siguiente debería funcionar:
fuente
Bash, como otros shells, es solo una herramienta para coordinar otros comandos. Por lo general, intentaría usar comandos UNIX estándar, pero, por supuesto, puede usar Bash para invocar cualquier cosa, incluidos sus propios programas compilados, otros scripts de shell, scripts de Python y Perl, etc.
En este caso, hay un par de formas de hacerlo.
Si desea leer un archivo y escribirlo en otro archivo, haciendo una búsqueda / reemplazo a medida que avanza, use sed:
Si desea editar el archivo en su lugar (como si abriera el archivo en un editor, lo editara y luego lo guardara) proporcione instrucciones al editor de línea 'ex'
Ex es como vi sin el modo de pantalla completa. Puede darle los mismos comandos que usaría en el indicador ':' de vi.
fuente
Encontré este hilo entre otros y estoy de acuerdo en que contiene las respuestas más completas, así que también agrego las mías:
sedyedson muy útiles ... a mano. Mira este código de @Johnny:Cuando mi restricción es usarlo en un script de shell, no se puede usar ninguna variable dentro de "abc" o "XYZ". El BashFAQ parece estar de acuerdo con lo que entiendo por lo menos. Entonces, no puedo usar:
¿pero que podemos hacer? Como, @Johnny dijo usar un
while read...pero, desafortunadamente, ese no es el final de la historia. Lo siguiente funcionó bien conmigo:Como se puede ver si
nullglobestá configurado entonces, se comporta de manera extraña cuando hay una cadena que contiene un*como en:que se convierte
no hay un ángulo angular final y Apache2 ni siquiera puede cargarse.
Este tipo de análisis debería ser más lento que la búsqueda y el reemplazo de un solo clic, pero, como ya vio, hay cuatro variables para cuatro patrones de búsqueda diferentes que funcionan en un ciclo de análisis.
La solución más adecuada que se me ocurre con los supuestos del problema.
fuente
sed -e "s/$x/$y/", y funcionará. No las comillas dobles. Puede ser muy confuso si las cadenas de las variables contienen caracteres con un significado especial. Por ejemplo si x = "/" o x = "\". Cuando encuentre estos problemas, probablemente significa que debe dejar de intentar usar el shell para este trabajo.Puedes usar
sed:Úselo
-ipara "ignorar mayúsculas y minúsculas" si no está seguro de que el texto para encontrar esabcoABCoAbC, etc.Puede usar
findysedsi no conoce su nombre de archivo:Buscar y reemplazar en todos los archivos de Python:
fuente
También puede usar el
edcomando para realizar búsquedas en el archivo y reemplazar:Ver más en " Edición de archivos mediante scripts con
ed".fuente
sed -i <pattern> <filename>). ¡Muy agradable!Si el archivo en el que está trabajando no es tan grande, y almacenarlo temporalmente en una variable no es un problema, entonces puede usar la sustitución de cadenas Bash en todo el archivo de una vez; no hay necesidad de revisarlo línea por línea:
Todo el contenido del archivo se tratará como una cadena larga, incluidos los saltos de línea.
XYZ puede ser una variable
$replacement, por ejemplo , y una ventaja de no usar sed aquí es que no necesita preocuparse de que la cadena de búsqueda o reemplazo pueda contener el carácter delimitador de patrón sed (generalmente, pero no necesariamente, /). Una desventaja es no poder usar expresiones regulares o cualquiera de las operaciones más sofisticadas de sed.fuente
Tenga cuidado si reemplaza las URL con el carácter "/".
Un ejemplo de cómo hacerlo:
Extraído de: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
fuente
Pruebe el siguiente comando de shell:
fuente
sed, usesed -i''en su lugar.Para editar texto en el archivo de forma no interactiva, necesita un editor de texto en el lugar, como vim.
Aquí hay un ejemplo simple de cómo usarlo desde la línea de comandos:
Esto es equivalente a la respuesta @slim del ex editor, que es básicamente lo mismo.
Aquí hay algunos
exejemplos prácticos.Reemplazar texto
fooconbaren el archivo:Eliminando espacios en blanco finales para múltiples archivos:
Solución de problemas (cuando el terminal está atascado):
-V1param para mostrar mensajes detallados.-cwq!.Ver también:
fuente
-V1, para forzar el cierre, usewq!.También puedes usar python dentro del script bash. No tuve mucho éxito con algunas de las mejores respuestas aquí, y descubrí que esto funciona sin la necesidad de bucles:
fuente
Puedes usar el comando rpl. Por ejemplo, desea cambiar el nombre de dominio en todo el proyecto php.
Esto no es una clara causa, pero es muy rápido y útil. :)
fuente