diff --git a/cap12_buscar_y_sustituir.md b/cap12_buscar_y_sustituir.md index 0fa76d2..50a59d7 100644 --- a/cap12_buscar_y_sustituir.md +++ b/cap12_buscar_y_sustituir.md @@ -10,7 +10,7 @@ Puede ser complicado hacer coincidir las mayúsculas y minúsculas en el términ Sin embargo, hay ocasiones en las que necesitas buscar una frase específica con diferenciación entre mayúsculas o minúsculas. Una forma de hacer eso es inhabilitando la opción `ignorecase` mediante `set noignorecase`, pero es muy laborioso el inhabilitar y volver a habilitar la opción cada vez que necesites una u otra forma de realizar búsquedas. -Para evitar estar alternando la opción `ignorecase`, Vim tiene la opción `smartcase` para buscar cadenas de texto sin importar las mayúsculas o minúsculas si el patrón de búsqueda _contiene al menos una caracter en mayúscula_. Puedes combinar tanto `ignorecase` y `smartcase` para realizar búsquedas que no tengan en cuenta las mayúsculas cuando introduzcas caracteres en minúsculas y tenga en cuenta las mayúsculas y minúsculas cuando introduzcas una o más letras en mayúsculas. +Para evitar estar alternando la opción `ignorecase`, Vim tiene la opción `smartcase` para buscar cadenas de texto sin importar las mayúsculas o minúsculas si el patrón de búsqueda _contiene al menos una carácter en mayúscula_. Puedes combinar tanto `ignorecase` y `smartcase` para realizar búsquedas que no tengan en cuenta las mayúsculas cuando introduzcas caracteres en minúsculas y tenga en cuenta las mayúsculas y minúsculas cuando introduzcas una o más letras en mayúsculas. Dentro de tu archivo vimrc, añade: @@ -30,11 +30,11 @@ Hola * `/HOLA` encontrará solo "HOLA". * `/Hola` encontrará solo "Hola". -Solo hay una pega. ¿Qué pasa cuando necesitas solo encontrar la cadena de texto en minúscula? Cuando buscas `/hola`, Vim siempre encontrará sus variantes con mayúsculas. Puedes utilizar el patrón `\C` en cualquier parte en tu término de búsqueda para decirle a Vim que en el teŕmino de búsqueda tenga en cuenta las minúsculas. Ahora si ejecutas `/\Chola`, restringirá las coincidencias únicamente a "hola" y no aparecerán ni "HOLA" ni "Hola". +Solo hay una pega. ¿Qué pasa cuando necesitas solo encontrar la cadena de texto en minúscula? Cuando buscas `/hola`, Vim siempre encontrará sus variantes con mayúsculas. Puedes utilizar el patrón `\C` en cualquier parte en tu término de búsqueda para decirle a Vim que en el término de búsqueda tenga en cuenta las minúsculas. Ahora si ejecutas `/\Chola`, restringirá las coincidencias únicamente a "hola" y no aparecerán ni "HOLA" ni "Hola". -## El primer y último caracter en una línea +## El primer y último carácter en una línea -Puedes utilizar `^` para encontrar el primer caracter en una línea y `$` para encontrar el última caracter en una línea. +Puedes utilizar `^` para encontrar el primer carácter en una línea y `$` para encontrar el último carácter en una línea. Si tienes este texto: @@ -42,7 +42,7 @@ Si tienes este texto: hola hola ``` -Puedes llegar al primer "hola" con `/^hola`. El caracter que siga a `^` deberá ser el primer caracter de la línea. Para buscar el último "hola", ejecuta `/hola$`. El caracter anterior a `$` deberá se el último caracter de la línea. +Puedes llegar al primer "hola" con `/^hola`. El carácter que siga a `^` deberá ser el primer carácter de la línea. Para buscar el último "hola", ejecuta `/hola$`. El carácter anterior a `$` deberá se el último carácter de la línea. Si tienes el siguiente texto: @@ -111,13 +111,13 @@ Si necesitar buscar "foo" en "foobaz" pero no en "foobar", ejecuta: Todos tus términos de búsqueda hasta este punto han sido una búsqueda literal de una palabra. En la vida real, puede que tengas que utilizar un patrón general para encontrar tu texto. El patrón básico es el rango de caracteres, `[ ]`. -si necesitas buscar cualquier dígito, lo más probable es que no quieras escribir `/0\|1\|2\|3\|4\|5\|6\|7\|8\|9\|0` cada vez que lo necesites. En vez de eso, utiliza `/[0-9]` para encontrar cualquier dígito entre ese rango. La expresión `0-9` representa un rangos de números entre 0-9 que Vim intentará encontrar, así que si estás buscando dígitos entre 1 y 5, en ese caso utilizaríamos `/[1-5]`. +Si necesitas buscar cualquier dígito, lo más probable es que no quieras escribir `/0\|1\|2\|3\|4\|5\|6\|7\|8\|9\|0` cada vez que lo necesites. En vez de eso, utiliza `/[0-9]` para encontrar cualquier dígito entre ese rango. La expresión `0-9` representa un rangos de números entre 0-9 que Vim intentará encontrar, así que si estás buscando dígitos entre 1 y 5, en ese caso utilizaríamos `/[1-5]`. Los dígitos no son el único tipo de datos que Vim puede buscar. También puedes buscar entre `/[a-z]` para buscar letras en minúsculas y `/[A-Z]` para letras en mayúsculas. También puedes combinar estos rangos juntos. Si necesitas buscar dígitos entre 0-9 y a la vez letras en mayúsculas y minúsculas de la "a" a la "f" \(una cifra en hexadecimal\), puedes ejecutar `/[0-9a-fA-F]`. -Para realizar una búsqueda inversa, puedes añadir `^` dentro de los corchetes dentro del rango. Para buscar algo que no sea un dígito, ejecuta `/[^0-9]`. Vim encontrará cualquier caracter mientras que no sea un dígito. Ten en cuenta que el caracter \(`^`\) dentro de los corchetes del rango es diferente del caracter al principio de una línea \(ejemplo: `/^hello`\). Si el caracter está fuera del par de corchetes y es el primer caracter en el término de búsqueda, esto significa "el primer caracter en una línea". Si el caracter está dentro de un par de corchetes y es el primer caracter dentro de los corchetes, esto significa un operador de búsqueda negativo. `/^abc` encontrará el primer "abc" en una línea y `/[^abc]` encontrará cualquier caracter excepto una "a", "b" o "c". +Para realizar una búsqueda inversa, puedes añadir `^` dentro de los corchetes dentro del rango. Para buscar algo que no sea un dígito, ejecuta `/[^0-9]`. Vim encontrará cualquier carácter mientras que no sea un dígito. Ten en cuenta que el carácter \(`^`\) dentro de los corchetes del rango es diferente del carácter al principio de una línea \(ejemplo: `/^hello`\). Si el carácter está fuera del par de corchetes y es el primer carácter en el término de búsqueda, esto significa "el primer carácter en una línea". Si el carácter está dentro de un par de corchetes y es el primer carácter dentro de los corchetes, esto significa un operador de búsqueda negativo. `/^abc` encontrará el primer "abc" en una línea y `/[^abc]` encontrará cualquier carácter excepto una "a", "b" o "c". ## Buscando caracteres repetidos @@ -137,7 +137,7 @@ Puedes pasarle el argumento `count` a tu búsqueda. Tiene la siguiente sintaxis: {n,m} ``` -Por cierto, estas llaves de `count` necesitan ser _escapadas_ cuando las utilizas en Vim. El operador `count` es ubicado después del caracter que quieres incrementar. +Por cierto, estas llaves de `count` necesitan ser _escapadas_ cuando las utilizas en Vim. El operador `count` es ubicado después del carácter que quieres incrementar. Aquí tienes cuatro variaciones diferente de la sintaxis de `count`: @@ -155,9 +155,9 @@ Vim tiene unos rangos predefinidos para los caracteres más comunes como dígito ```text \d Dígitos [0-9] \D No digitos [^0-9] -\s Caracter de espacio en blanco (espacio y tabulador) -\S Caracter que no sea espacio en blanco (todo excepto un espacio o tabulador) -\w Caracter de palabra [0-9A-Za-z_] +\s Carácter de espacio en blanco (espacio y tabulador) +\S Carácter que no sea espacio en blanco (todo excepto un espacio o tabulador) +\w Carácter de palabra [0-9A-Za-z_] \l Letras minúsculas [a-z] \u Letras mayúsculas [A-Z] ``` @@ -181,7 +181,7 @@ Ejecuta esto: Vamos a diseccionar el comando: * `"` es una doble comilla literal. Encontrará la primera comilla doble. -* `[^"]` significa cualquier caracter excepto una comilla doble. Encontrará cualquier caracter alfanumérico y espacios en blanco mientras que no sea una comilla doble. +* `[^"]` significa cualquier carácter excepto una comilla doble. Encontrará cualquier carácter alfanumérico y espacios en blanco mientras que no sea una comilla doble. * `\+` significa uno o más. Como está precedido por `[^"]`, Vim busca uno o más caracteres que no sean una comilla doble. * `"` es una doble comilla literal. Encontrará las comillas dobles de cierre. @@ -269,7 +269,7 @@ Aquí tienes algunas variaciones para pasar el rango: * `:1,s/let/const/` - si no se da ningún dato después de la coma, también representa la línea actual. Sustituye desde la línea 1 hasta la línea actual. * `:3s/let/const/` - si solo se da un valor como rango \(sin coma\), realiza la sustitución únicamente en esa línea. -En Vim, `%` normalmente se refiere al archivo entero. Si ejecutas `:%s/let/const/`, esto realizará la sustitución en todas las líneas del archvo. Ten en mente la sintaxis de este rango. Muchos comandos para la línea de comandos que aprenderás en capítulos siguientes seguirán esta misma forma. +En Vim, `%` normalmente se refiere al archivo entero. Si ejecutas `:%s/let/const/`, esto realizará la sustitución en todas las líneas del archivo. Ten en mente la sintaxis de este rango. Muchos comandos para la línea de comandos que aprenderás en capítulos siguientes seguirán esta misma forma. ## Encontrando un patrón @@ -305,7 +305,7 @@ Vamos a ver el comando en detalle: * `:%s` esto busca en el archivo entero para realizar una acción de sustitución. * `\d` es el rango predefinido en Vim para los dígitos, similar a \(`[0-9]`\). -* `"\0"` las comillas dobles son literalmente comillas dobles. `\0` es un caracter especial que representa "el patrón de encontrado completo". El patrón de búsqueda aquí es un número de un solo dígito, `\d`. +* `"\0"` las comillas dobles son literalmente comillas dobles. `\0` es un carácter especial que representa "el patrón de encontrado completo". El patrón de búsqueda aquí es un número de un solo dígito, `\d`. De igual manera, el símbolo `&` también representa "el patrón encontrado completo" igual que `\0`. Por lo que `:s/\d/"&"/` también hubiera funcionado. @@ -325,7 +325,7 @@ Para hacer eso, ejecuta: :%s/\(\w\+\) \(\w\+\)/\2 \1/ ``` -El comando anterior contine demasiadas barras invertidas y es difícil de leer. Es más conveniente utilizar el operador `\v`: +El comando anterior contiene demasiadas barras invertidas y es difícil de leer. Es más conveniente utilizar el operador `\v`: ```text :%s/\v(\w+) (\w+)/\2 \1/ @@ -344,7 +344,7 @@ let cinco = "5"; ¡Genial! Veamos el comando en detalle: * `:%s` busca en todas las líneas del archivo para realizar la sustitución. -* `(\w+) (\w+)` agrupa los patrones. `\w` es uno de los rangos predefinidos de Vim para un caracter de una palabra \(`[0-9A-Za-z_]`\). Los paréntesis `( )` rodeando captura un caracter de palabra coincidente en un frupo. Ten en cuenta el espacio entre los dos agrupamientos. `(\w+) (\w+)` captura en dos grupos. en la primera línea, el primer grupo captura el "uno" y el segundo grupo captura el "dos". +* `(\w+) (\w+)` agrupa los patrones. `\w` es uno de los rangos predefinidos de Vim para un carácter de una palabra \(`[0-9A-Za-z_]`\). Los paréntesis `( )` rodeando captura un carácter de palabra coincidente en un grupo. Ten en cuenta el espacio entre los dos agrupamientos. `(\w+) (\w+)` captura en dos grupos. En la primera línea, el primer grupo captura el "uno" y el segundo grupo captura el "dos". * `\2 \1` devuelve el grupo capturado en orden inverso. `\2` contiene la cadena "let" y `\1` la cadena "uno". Al tener `\2 \1` esto devuelve la cadena "let uno". Recordemos que `\0` representa el patrón encontrado al completo. Puedes romper la cadena encontrada en grupos más pequeños con `( )`. Cada grupo es representado por `\1`, `\2`, `\3`, etc. @@ -371,7 +371,7 @@ El resultado es: 987 ``` -Cada `(\d)` encuentra y agrupa cada dígito. En la primera línea, el primer `(\d)` tiene el valor "1", el segundo `(\d)` "2" y el trecer `(\d)` "3". Son almacenados en las variables `\1`, `\2` y `\3`. En la segunda mitad de tu sustitución, el nuevo patrón `\3\2\1` resultará en el valor "321" en la primera línea. +Cada `(\d)` encuentra y agrupa cada dígito. En la primera línea, el primer `(\d)` tiene el valor "1", el segundo `(\d)` "2" y el tercer `(\d)` "3". Son almacenados en las variables `\1`, `\2` y `\3`. En la segunda mitad de tu sustitución, el nuevo patrón `\3\2\1` resultará en el valor "321" en la primera línea. Si hubieras ejecutado este comando: @@ -391,7 +391,7 @@ Esto es debido a que ahora solo tienes dos grupos. El primer grupo, capturado po ## Las opciones de sustitución -Si tienes la sigueinte frase: +Si tienes la siguiente frase: ```text tarta de chocolate, tarta de fresa, tarta de frambuesa @@ -446,7 +446,7 @@ Para sustituirla por la palabra "hola", ejecuta: :s/https:\/\/mysite.com\/a\/b\/c\/d\/e/hola/ ``` -Sin embargo, es difícil discernir qué barras \(`/`\) son parte del patrón de sustitución y cuales son delimitadores. Puedes cambiar el delimitador por cualquier caracter de un único byte \(excepto por letras, números o `"`, `|`, y `\`\). Vamos a reemplazarlo por `+`. El comando de sustitución anterior puede ser reescrito como: +Sin embargo, es difícil discernir qué barras \(`/`\) son parte del patrón de sustitución y cuales son delimitadores. Puedes cambiar el delimitador por cualquier carácter de un único byte \(excepto por letras, números o `"`, `|`, y `\`\). Vamos a reemplazarlo por `+`. El comando de sustitución anterior puede ser reescrito como: ```text :s+https:\/\/mysite.com\/a\/b\/c\/d\/e+hola+ @@ -456,7 +456,7 @@ Ahora es más sencillo ver donde están los delimitadores. ## Reemplazo especial -También puedes modificar las mayúsculas o minúsculas del texto que está sustituyendo. Dadas las siguientes expresiones, tu tatera es convertir en mayúsculas las variables "uno", "dos", "tres", etc. +También puedes modificar las mayúsculas o minúsculas del texto que está sustituyendo. Dadas las siguientes expresiones, tu tare es convertir en mayúsculas las variables "uno", "dos", "tres", etc. ```text let uno = "1"; @@ -488,7 +488,7 @@ Veamos el comando en detalle: * `\1` devuelve el valor del primer grupo: "let". * `\U\2` cambia a mayúsculas \(`\U`\) el segundo grupo \(`\2`\). -El truco de este comando reside en la expresión `\U\2`. `\U` hace que el siguiente caracter sea convertido a mayúsculas. +El truco de este comando reside en la expresión `\U\2`. `\U` hace que el siguiente carácter sea convertido a mayúsculas. Vamos a ver un ejemplo más. Supongamos que estás escribiendo una guía sobre Vim y necesitas convertir en mayúsculas la primera letra de cada palabra de una línea. @@ -502,7 +502,7 @@ Puedes ejecutar: :s/\<./\u&/g ``` -The result: +El resultado: ```text Vim Es El Mejor Editor De Texto En Toda La Galaxia @@ -511,8 +511,8 @@ Vim Es El Mejor Editor De Texto En Toda La Galaxia Veamos el comando en detalle: * `:s` realiza la sustitución en la línea actual. -* `\<.` está formado por dos partes: `\<` para encontrar el comienzo de cada palabra y `.` para encontrar cualquier caracter. El operador `\<` hace que el siguiente caracter sea el primer caracter de una palabra. Como `.` es el siguiente caracter, esto encontrará el primer caracter de cualquier palabra. -* `\u&` convierte en mayúsculas el símbolo `&`. Recordemos que `&` \(o `\0`\) representa la coincidencia entera. Encontrará el primer caracter de cualquier palabra. +* `\<.` está formado por dos partes: `\<` para encontrar el comienzo de cada palabra y `.` para encontrar cualquier carácter. El operador `\<` hace que el siguiente carácter sea el primer carácter de una palabra. Como `.` es el siguiente carácter, esto encontrará el primer carácter de cualquier palabra. +* `\u&` convierte en mayúsculas el símbolo `&`. Recordemos que `&` \(o `\0`\) representa la coincidencia entera. Encontrará el primer carácter de cualquier palabra. * `g` la opción o _flag_ global. Sin este, este comando solo sustituirá la primera coincidencia encontrada. Y deberemos sustituir cada coincidencia encontrada en esta línea. Para aprender más sobre los símbolos especiales de sustitución como `\u` y `\U`, echa un vistazo a la ayuda de Vim `:h sub-replace-special`. @@ -528,13 +528,13 @@ salve vim bonjour vim ``` -Y necesitas sustituie la palabra "vim" por "amigo" pero solo en las líneas que contengan las palabras "hello" u "hola". Recuerda que en este capítulo vimos que se podía utilizar `|` para encadenar múltiples patrones. +Y necesitas sustituir la palabra "vim" por "amigo" pero solo en las líneas que contengan las palabras "hello" u "hola". Recuerda que en este capítulo vimos que se podía utilizar `|` para encadenar múltiples patrones. ```text :%s/\v(hello|hola) vim)/\1 amigo/g ``` -The result: +El resultado: ```text hello amigo @@ -591,12 +591,12 @@ Veamos en detalle el comando: * `:s/` el comando de sustitución. * `\v` es la clave mágica así no es necesario escapar palabras clave especiales. -* `.` encuentra cualquier único caracter. -* `{-}` realiza una coincidencia no excesiva de 0 o más del caracter anterior. +* `.` encuentra cualquier único carácter. +* `{-}` realiza una coincidencia no excesiva de 0 o más del carácter anterior. * `\zsMississippi` hace que "Mississippi" sea el comienzo de la coincidencia. * `(...){3}` busca la tercera coincidencia de los parámetros anteriores. -Ya has visto antes la sintaxis de `{3}`. Es del tipo `{n,m}`. En este caso, tienes `{3}` que será exactamente la tercera coincidencia. El único truco nuevo que hemos utilizado aquí es `{-}`. Es una coincidencia no excesiva. Encuentra la coincidencia más corta dada en el patrón. En este caso, `(.{-}Mississippi)` encuentra la mínima cantidad de "Mississippi" precedida por cualquier caracter. Esto contrasta con `(.*Mississippi)` que encuentra la coincidencia más larga del patrón dado. +Ya has visto antes la sintaxis de `{3}`. Es del tipo `{n,m}`. En este caso, tienes `{3}` que será exactamente la tercera coincidencia. El único truco nuevo que hemos utilizado aquí es `{-}`. Es una coincidencia no excesiva. Encuentra la coincidencia más corta dada en el patrón. En este caso, `(.{-}Mississippi)` encuentra la mínima cantidad de "Mississippi" precedida por cualquier carácter. Esto contrasta con `(.*Mississippi)` que encuentra la coincidencia más larga del patrón dado. Si utilizas `(.{-}Mississippi)`, esto encontrará cinco coincidencias: "Uno Mississippi", "dos Mississippi", etc. Si utilizas `(.*Mississippi)`, encontrarás una coincidencia: el último "Mississippi". Para aprender más, echa un vistazo `:h /\{-` y `:h non-greedy`. @@ -612,7 +612,7 @@ Puedes encontrar "abc1de1" \(coincidencia excesiva o _greedy_\) con: /a.*1 ``` -Puedes encontrar "abc1" \(coincidencia no excesiva o _non-greedy_\) with: +Puedes encontrar "abc1" \(coincidencia no excesiva o _non-greedy_\) con: ```text /a.\{-}1 @@ -662,7 +662,7 @@ medium dog small dog ``` -Asumimos que la escrutura del directorio es la siguiente: +Asumimos que la estructura del directorio es la siguiente: ```text - food.txt @@ -719,7 +719,7 @@ Veamos los pasos seguidos en detalle: ## Aprendiendo a buscar y sustituir de la manera más inteligente -La habilidad para realizar búsquedas correctas es una habilidad necesaria cuando se está editando. Dominar las búsquedas te permite utilizar la flexibilidad de las expresiones regulares para buscar cualquier patrón en un archivo. Tómate tu tiempo para aprender estas técnicas. Incluso haz las búsquedas y sustituciones de este capítulo por tí mismo. Hace tiempo leí un libro sobre expresiones regulares sin realmente realizar ninguna y he olvidado casi por completo todo lo que leí. La lectura activa practicando es la mejor manera de dominar cualquier habilidad. +La habilidad para realizar búsquedas correctas es una habilidad necesaria cuando se está editando. Dominar las búsquedas te permite utilizar la flexibilidad de las expresiones regulares para buscar cualquier patrón en un archivo. Tómate tu tiempo para aprender estas técnicas. Incluso haz las búsquedas y sustituciones de este capítulo por ti mismo. Hace tiempo leí un libro sobre expresiones regulares sin realmente realizar ninguna y he olvidado casi por completo todo lo que leí. La lectura activa practicando es la mejor manera de dominar cualquier habilidad. Una buena manera de mejorar tu habilidad con los patrones de búsqueda es, todo lo que necesites buscar con un patrón \(como "hello 123"\), en vez de buscarlo de manera literal el término completo \(`/hello 123`\), intenta realizarlo con un patrón \(`/\v(\l+) (\d+)`\). Muchos de estos conceptos de expresiones regulares también son aplicables a la programación en general, no solo cuando estás utilizando Vim.