Pregunta ¿Cómo hacer un hallazgo recursivo / reemplazar una cadena con awk o sed?


¿Cómo puedo encontrar y reemplazar cada ocurrencia de:

subdomainA.example.com

con

subdomainB.example.com

en cada archivo de texto debajo del /home/www/ árbol de directorios recursivamente?


522
2017-10-17 21:10


origen


Respuestas:


Nota: No ejecute este comando en una carpeta que incluya un repositorio de git; los cambios en .git podrían dañar su índice de git.

find /home/www -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

De man find:

-print0   (Sólo GNU find) le dice a find que use el carácter nulo (\ 0) en lugar del espacio en blanco como el delimitador de salida entre las rutas encontradas. Esta es una opción más segura si sus archivos pueden contener espacios en blanco u otro carácter especial. Se recomienda utilizar el argumento -print0 para encontrar si usa el comando -exec o xargs (el argumento -0 es necesario en xargs).


701
2017-10-17 21:32



Nota: No ejecute este comando en una carpeta que incluya un repositorio de git; los cambios en .git podrían dañar su índice de git.

find /home/www/ -type f -exec \
    sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

Comparado con otras respuestas aquí, esto es más simple que la mayoría y usa sed en lugar de perl, que es lo que la pregunta original solicitó.


209
2017-10-18 19:34



La forma más sencilla para mí es

grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'

63
2018-03-13 17:05



Todos los trucos son casi lo mismo, pero me gusta este:

find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
  • find <mydir>: buscar en el directorio.

  • -type f:

    El archivo es del tipo: archivo regular

  • -exec command {} +:

    Esta variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se construye añadiendo             cada nombre de archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de             archivos coincidentes. La línea de comando está construida de la misma manera que xargs construye sus líneas de comando. Solo una instancia de             `{} 'está permitido dentro del comando. El comando se ejecuta en el directorio de inicio.


54
2018-01-31 12:00



cd /home/www && find . -type f -print0 |
  xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'

39
2017-10-17 21:13



Para mí, la solución más fácil de recordar es https://stackoverflow.com/a/2113224/565525, es decir

sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f)

NOTA: -i '' resuelve el problema OSX sed: 1: "...": invalid command code .

NOTA: Si hay demasiados archivos para procesar, obtendrá Argument list too long. La solución alternativa: uso find -exec o xargs solución descrita anteriormente.


25
2017-09-03 10:00



Para cualquiera que use buscador plateado (ag)

ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'

Como ag ignora git / hg / svn file / folders de forma predeterminada, es seguro ejecutarlo dentro de un repositorio.


18
2017-09-02 05:19



Para reducir los archivos de forma recursiva sed a través de, podrías grep para su instancia de cadena:

grep -rl <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g

Si tu corres man grep notarás que también puedes definir un --exlude-dir="*.git" marcar si desea omitir la búsqueda a través de directorios .git, evitando los problemas del índice git como otros señalaron amablemente.

Guiando a:

grep -rl --exclude-dir="*.git" <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g

15
2017-08-22 20:28



Un buen oneliner como extra. Usando git grep.

git grep -lz 'subdomainA.example.com' | xargs -0 perl -i'' -pE "s/subdomainA.example.com/subdomainB.example.com/g"

12
2018-02-10 19:07



Este es compatible con repositorios git, y un poco más simple:

Linux:

git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'

Mac:

git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'

(Gracias a http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/)


11
2018-06-24 08:26