Androide

Cómo usar sed para buscar y reemplazar cadenas en archivos

Cambiar cadena de caracteres dentro de un fichero en Gnu/Linux con el comando sed

Cambiar cadena de caracteres dentro de un fichero en Gnu/Linux con el comando sed

Tabla de contenido:

Anonim

Muy a menudo, cuando trabaje con archivos de texto, necesitará buscar y reemplazar cadenas de texto en uno o más archivos.

sed es un s tream ed itor. Puede realizar la manipulación básica de texto en archivos y flujos de entrada, como tuberías. Con sed puede buscar, encontrar y reemplazar, insertar y eliminar palabras y líneas. Admite expresiones regulares básicas y extendidas que le permiten combinar patrones complejos.

, hablaremos sobre cómo encontrar y reemplazar cadenas con sed . También le mostraremos cómo realizar una búsqueda recursiva y reemplazar.

Buscar y reemplazar cadena con sed

Existen varias versiones de sed , con algunas diferencias funcionales entre ellas. macOS usa la versión BSD y la mayoría de las distribuciones de Linux vienen con GNU sed preinstalado por defecto. Usaremos la versión GNU.

La forma general de buscar y reemplazar texto usando sed toma la siguiente forma:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i : de forma predeterminada, sed escribe su salida en la salida estándar. Esta opción le dice a sed que edite los archivos en su lugar. Si se proporciona una extensión (ex -i.bak), se creará una copia de seguridad del archivo original. s - El comando sustituto, probablemente el comando más utilizado en sed. / / / - Carácter delimitador. Puede ser cualquier carácter, pero generalmente se utiliza el carácter de barra diagonal ( / ). SEARCH_REGEX : cadena normal o una expresión regular para buscar. REPLACEMENT - La cadena de reemplazo. g - Bandera de reemplazo global. Por defecto, sed lee el archivo línea por línea y cambia solo la primera aparición de SEARCH_REGEX en una línea. Cuando se proporciona el indicador de reemplazo, se reemplazarán todos los sucesos. INPUTFILE : el nombre del archivo en el que desea ejecutar el comando.

Es una buena práctica poner comillas alrededor del argumento para que los metacaracteres del shell no se expandan.

Veamos ejemplos de cómo usar el comando sed para buscar y reemplazar texto en archivos con algunas de sus opciones e indicadores más utilizados.

Para fines de demostración, utilizaremos el siguiente archivo:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Con la bandera de reemplazo global sed reemplaza todas las ocurrencias del patrón de búsqueda:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Como habrás notado, en el ejemplo anterior también se reemplaza el subcadena foo dentro de la cadena foobar . Si este no es el comportamiento deseado, use la expresión de límite de palabras ( \b ) en ambos extremos de la cadena de búsqueda. Esto asegura que las palabras parciales no coincidan.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Para que el patrón no coincida con mayúsculas y minúsculas, use la bandera I En el siguiente ejemplo, estamos utilizando las banderas g e I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

La opción más fácil y mucho más legible es usar otro carácter delimitador. La mayoría de las personas usa la barra vertical ( | ) o los dos puntos (:) pero puede usar cualquier otro carácter:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

También puedes usar expresiones regulares. Por ejemplo, para buscar todos los números de 3 dígitos y reemplazarlos con el number cadena que usaría:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Otra característica útil de sed es que puede usar el carácter de & comercial que corresponde al patrón coincidente. El personaje se puede usar varias veces.

Por ejemplo, si desea agregar llaves {} alrededor de cada número de 3 dígitos, escriba:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Por último, pero no menos importante, siempre es una buena idea hacer una copia de seguridad al editar un archivo con sed . Para hacer eso solo proporcione una extensión a la opción -i . Por ejemplo, para editar el file.txt y guardar el archivo original como file.txt.bak , usaría:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Buscar y reemplazar recursivo

A veces, desea buscar en los directorios de forma recursiva archivos que contengan una cadena y reemplazar la cadena en todos los archivos. Esto se puede hacer mediante el uso de comandos como find o grep para buscar archivos de forma recursiva en el directorio y canalizar los nombres de los archivos a sed .

El siguiente comando buscará archivos de forma recursiva en el directorio de trabajo actual y pasará los nombres de archivo a sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Para evitar problemas con los archivos que contienen espacio en sus nombres, use la opción -print0 que le dice a find que imprima el nombre del archivo, seguido de un carácter nulo y canalice la salida a sed usando xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Para excluir un directorio, use la opción -not -path . Por ejemplo, si está reemplazando una cadena en su repositorio local de git para excluir todos los archivos que comienzan con punto ( . ), Use:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Otra opción es usar el comando grep para buscar recursivamente todos los archivos que contienen el patrón de búsqueda y luego canalizar los nombres de archivo a sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Conclusión

Aunque pueda parecer complicado y complejo, al principio, buscar y reemplazar texto en archivos con sed es muy simple.

Para obtener más información sobre los comandos, las opciones y los indicadores de sed, visite el manual de GNU sed y el tutorial de Grymoire sed. Si tiene alguna pregunta o comentario, no dude en dejar un comentario.

terminal sed