¿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, XYZ
en 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/..../..../ - Substitute
y/g - Global
invalid command code C
error ... Para los reemplazos en el lugar, BSDsed
requiere una extensión de archivo después de la-i
marca porque guarda un archivo de respaldo con la extensión dada. Por ejemplo:sed -i '.bak' 's/find/replace/' /file.txt
puede omitir la copia de seguridad utilizando una cadena vacía como esta:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
La manipulación de archivos normalmente no es realizada por Bash, sino por programas invocados por Bash, por ejemplo:
La
-i
bandera le dice que haga un reemplazo en el lugar.Consulte
man perlrun
para 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
replace
comando que se incluye con el"mysql-server"
paquete, así que si lo ha instalado, pruébelo:Vea
man replace
para más sobre esto.fuente
replace
es una herramienta útil e independiente y la gente de MySQL debería liberarla por separado y depender de ella b)replace
requiere un poco de MySQL o_O De cualquier manera, instalar mysql-server para reemplazarlo sería lo incorrecto. :)mysql-server
paquete instalado. Como señaló @rayro,replace
es 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:
sed
yed
son 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
nullglob
está 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
-i
para "ignorar mayúsculas y minúsculas" si no está seguro de que el texto para encontrar esabc
oABC
oAbC
, etc.Puede usar
find
ysed
si no conoce su nombre de archivo:Buscar y reemplazar en todos los archivos de Python:
fuente
También puede usar el
ed
comando 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
ex
ejemplos prácticos.Reemplazar texto
foo
conbar
en el archivo:Eliminando espacios en blanco finales para múltiples archivos:
Solución de problemas (cuando el terminal está atascado):
-V1
param 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