Encuentra y reemplaza texto dentro de múltiples archivos

84

Quiero saber cómo puedo encontrar y reemplazar un texto específico en varios archivos como en Notepad ++ en el tutorial vinculado.

por ejemplo: http://cybernetnews.com/find-replace-multiple-files/

Faruk Uzun
fuente
No tendrá la interfaz gráfica, pero le recomiendo que examine sed (man sed). Es el editor de secuencias que existe desde el comienzo de UNIX.
apolinsky

Respuestas:

136

Aquí uso sed para reemplazar cada aparición de la palabra "cybernetnews" con "cybernet" en cada archivo con la extensión, c, en el directorio, / home / user / directory /.

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

Una variación más genérica en la que busca de forma recursiva desde el directorio de ejecución y opera solo en archivos normales, legibles y grabables:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
gregtczap
fuente
2
Voté por esto porque es un método tan eficiente
Sabacon, el
44
Se votó porque sed es la mejor opción de la OMI, pero la respuesta sería más útil si explicara los componentes de la respuesta (personalmente, no estoy familiarizado y tengo curiosidad sobre el {} \;)
sequoia mcdowell
55
@sequoiamcdowell Woo! ¡Me perdí esto! Lo siento. Las llaves significan básicamente "para cada partido" y el punto y coma (\;) escapado es para evitar el doble análisis. No queremos que el shell compatible con bourne y sed intenten analizar el comando, solo sed.
@Christopher ¿cómo funciona si la palabra contiene espacios como cyber net news? ¿Cómo puedo convertir esto a cyber net?
Khurshid Alam
1
@KhurshidAlam Use la clase de caracteres con el sed -i -e "s/cyber\snet\snews/cyber net/g"
27

El editor de flujo, sed, es una poderosa utilidad para este tipo de trabajo y es mi primera opción, sin embargo, si desea hacer esto desde un editor de texto ordinario usando una aplicación nativa basada en Ubuntu, le sugiero que eche un vistazo a Jedit , Está disponible en los repositorios y puede instalarse escribiendo en su consola:

sudo apt-get install jedit

Inicie jedit, haga clic en el elemento del menú de búsqueda, en la lista del menú, haga clic en el elemento Buscar en el directorio, se le presentará el siguiente diálogo:

Cuadro de diálogo Buscar en la carpeta Jedit

Esto es similar al de Notepad ++ y hace lo mismo, creo que esto es lo que quieres.

Sabacon
fuente
Esto era perfecto para cuando estaba buscando una línea completa de código, y dudaba en escapar de cada personaje especial de expresiones regulares si hubiera hecho lo mismo sed.
IQAndreas
puede reemplazar bloques de código (como html, javascript, etc.) en segundos.
lepe
Esto no funciona en una gran cantidad de archivos, después de un par de horas no había hecho un reemplazo, mientras que geany tardó unos minutos en encontrar todos los sucesos. Esto puede no ser una búsqueda y reemplazo eficiente, pero calienta la habitación muy bien.
Mark Aroni
19

Otra opción de GUI es regexxer : captura de pantalla de regexxer

int_ua
fuente
Funciona perfectamente (si ya está familiarizado con Regex), gracias.
Ernest
1
Incluso, si no conoce la expresión regular, puede usar esta herramienta como una simple herramienta de búsqueda y reemplazo de cadenas y hará el trabajo por usted, sin necesidad de expresiones regulares ni nada.
Mohd Abdul Mujib
13
perl -pi -e 's/oldtext/newtext/g' *

reemplaza cualquier aparición de texto antiguo por texto nuevo en todos los archivos de la carpeta actual. Sin embargo, tendrá que escapar de todos los caracteres especiales de Perl dentro de texto antiguo y texto nuevo utilizando la barra invertida.

Michael K
fuente
9

Consulte con Geany , es el reemplazo perfecto de NPP para Linux. Puedes hacer exactamente eso y puedes usar regex.

Stefano Mtangoo
fuente
¡Amo a Geany! Es mi editor favorito y es lo suficientemente potente.
Pisu
1
Por lo que puedo decir, Geany 1.23.1 (empaquetado con Ubuntu 13.10) permite buscar múltiples archivos usando regex, pero no reemplazándolos.
Drew Noakes
Puede buscar y reemplazar en Geany múltiples archivos si los abre todos y luego usa el botón "en sesión" en el cuadro de diálogo Buscar / Reemplazar.
MV.
1
¿Cómo abres 5000 archivos listados en la pestaña de mensajes?
Mark Aroni
1
Ok, el regexxer era más o menos lo que había estado pidiendo, lo había omitido anteriormente debido a que su nombre tenía regex y tiendo a evitar cualquier cosa que tenga que ver con regex. Pero me equivoqué, y esa herramienta tiene exactamente lo que se requiere para buscar y reemplazar.
Mohd Abdul Mujib
2

Puede usar este script, copiar código y crear un archivo find_and_replace_in_files.sh.

Lo he modificado un poco; Por favor, dime tu opinión.

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i
dimitrios
fuente
2

Otro programa es Searchmonkey .

SearchMonkey es una aplicación Gtk liviana que tiene como objetivo reemplazar el engorroso hallazgo / grep con una interfaz de usuario ingeniosa que proporciona rápidamente un marcado que muestra las ubicaciones y la cantidad de coincidencias de texto. El objetivo es proporcionar una herramienta de búsqueda fácil de usar y accesible para usuarios finales y desarrolladores de software por igual.

vrcmr
fuente
2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

funciona para mí en fedora

usuario328359
fuente
Puede agregar una línea que explique cómo esto mejora con askubuntu.com/a/84013/158442
muru
@muru ¡Ejecuta muchas menos sedinstancias! Por lo tanto, es mucho más rápido en términos de tiempo de CPU. Debido a que el tiempo de acceso a los archivos sería limitado, creo que no es mucho más rápido en el tiempo del reloj, pero da una menor carga del sistema. Note xargscolocará lotes, como hundereds, de nombres de archivo en la línea de comando de un solo sedcomando, llenando el tamaño del búfer disponible en función de la longitud de las rutas.
Volker Siegel
Hmm ... si esto se cierra, podría reemplazarlo con uno que explique claramente por qué es mejor que el votado.
Volker Siegel
@VolkerSiegel que se puede lograr con en +lugar de \;adentro find, ¿verdad?
muru
1
@muru Posiblemente ... Mi "herramienta adecuada para el trabajo" -instincto claramente lo prefiere xargs, pero tienes razón; desde man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Me hace pensar en las líneas de comando de git filter-branch...;)
Volker Siegel
2

Una solución muy simple: reemplazar en todos los *.txtarchivos en la carpeta string_1con string_2:

sed -i 's/string_1/string_2/g' *.txt
Helmut P.
fuente
¡Gran respuesta! Solo alguna adición. Si desea reemplazar una cadena en cualquier archivo del directorio actual de forma recursiva, intente esto:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan