tag editar easytag linux grep replace

editar - linux easytag



Cómo grep y reemplazar (8)

Necesito buscar recursivamente una cadena especificada dentro de todos los archivos y subdirectorios dentro de un directorio y reemplazar esta cadena con otra cadena.

Sé que el comando para encontrarlo podría verse así:

grep ''string_to_find'' -r ./*

Pero, ¿cómo puedo reemplazar cada instancia de string_to_find con otra cadena?



Incluso podrías seguir así ...

Ejemplo

grep -rl ''windows'' ./ | xargs sed -i ''s/windows/linux/g''

Esto buscará la cadena '' windows '' en todos los archivos relativos al directorio actual y reemplazará '' windows '' con '' linux '' por cada aparición de la cadena en cada archivo.


Otra opción es usar find y luego pasarlo a través de sed.

find /path/to/files -type f -exec sed -i ''s/oldstring/new string/g'' {} /;


Otra opción sería usar perl con globstar.

Habilitar shopt -s globstar en su .bashrc (o en cualquier otro lugar) permite que el ** patrón global coincida con todos los subdirectorios y archivos recursivamente.

Por lo tanto, al usar perl -pXe ''s/SEARCH/REPLACE/g'' -i ** se sustituirá recursivamente SEARCH con REPLACE .

La bandera -X le dice a Perl que "desactive todas las advertencias", lo que significa que no se quejará de los directorios.

El globstar también le permite hacer cosas como sed -i ''s/SEARCH/REPLACE/g'' **/*.ext si desea reemplazar SEARCH con REPLACE en todos los archivos secundarios con la extensión .ext .


Otras soluciones mezclan sintaxis regex. Para usar patrones perl / PCRE tanto para buscar como para reemplazar, y evitar el procesamiento de cada archivo, esto funciona bastante bien:

grep -rlZP ''match1'' | xargs -0r perl -pi -e ''s/match2/replace/g;''

donde match1 y match2 suelen ser idénticos, pero match1 se puede simplificar para eliminar funciones más avanzadas que solo son relevantes para la sustitución, por ejemplo, grupos de captura.

Traducción: grep recursivamente y liste los archivos coincidentes, separados por nul para proteger cualquier carácter especial en el nombre de archivo, que coincida con este patrón PCRE, luego canalice esos nombres de archivo a xargs que espera una lista separada por nulos, pero no hará nada si no se reciben los nombres, y obtener perl para reescribir cada archivo, sustituyendo las líneas donde se encuentran las coincidencias.

Agregue la opción I a grep para ignorar los archivos binarios, también.


Tengo la respuesta.

grep -rl matchstring somedir/ | xargs sed -i ''s/string1/string2/g''


Usualmente no con grep, sino con sed -i ''s/string_to_find/another_string/g'' o perl -i.bak -pe ''s/string_to_find/another_string/g'' .


buscar y reemplazar en el modo vi de un archivo La sintaxis es la siguiente::% s / WORD-To-Find-HERE / Replace-Word-Here / g

O:% s / FindMe / ReplaceME / g

Ejemplos

El comando sustituto se puede usar según sus requisitos.