Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
tutorial_de_sed [2022/05/10 22:23] – peron | tutorial_de_sed [2022/07/08 23:04] (actual) – peron | ||
---|---|---|---|
Línea 32: | Línea 32: | ||
Si bien las sustituciones son probablemnete el empleo mas común que se hace de sed, es conveniente también saber cómo seleccionar y hacer coincidir texto. | Si bien las sustituciones son probablemnete el empleo mas común que se hace de sed, es conveniente también saber cómo seleccionar y hacer coincidir texto. | ||
- | === Seleccionar Texto === | + | ==== Seleccionar Texto ==== |
Utiliza un fichero de texto para nuestro ejemplo. Usa uno que contiene un poema gauchesco décimas de Martín Castro, " | Utiliza un fichero de texto para nuestro ejemplo. Usa uno que contiene un poema gauchesco décimas de Martín Castro, " | ||
Línea 44: | Línea 44: | ||
less hachando.txt | less hachando.txt | ||
- | Para seleccionar algunas líneas del finchero, proveemos la línea inicial y la línea final del rango de selección. Si usamos un número aislado, sólo seleccionaremos dicha línea. | + | Para seleccionar algunas líneas del fichero, proveemos la línea inicial y la línea final del rango de selección. Si usamos un número aislado, sólo seleccionaremos dicha línea. |
Para extraer las diez líneas que componen la primer décima, ingresa este comando: | Para extraer las diez líneas que componen la primer décima, ingresa este comando: | ||
Línea 52: | Línea 52: | ||
</ | </ | ||
- | Observa la coma entre 3 y 12. La p significa " | + | Observa la coma entre 3 y 12. La '' |
Ahora cambia los números de línea de modo que podamos seleccionar un verso diferente, como se indica: | Ahora cambia los números de línea de modo que podamos seleccionar un verso diferente, como se indica: | ||
Línea 60: | Línea 60: | ||
</ | </ | ||
- | Puedes usar la opción -e (" | + | Puedes usar la opción |
<file bash> | <file bash> | ||
Línea 72: | Línea 72: | ||
</ | </ | ||
- | También puedes escoger una línea de comienzo e indicarle a sed que avance a lo largo del fichero e imprima las líneas alternadamente, | + | También puedes escoger una línea de comienzo e indicarle a sed que avance a lo largo del fichero e imprima las líneas alternadamente, |
El primer número indicará el comienzo de la línea. El segundo número le indicará a sed qué líneas luego de la línea de comienzo deseas ver. El número 2 significa cada segunda línea, 3 significa cada tercer línea, y así. | El primer número indicará el comienzo de la línea. El segundo número le indicará a sed qué líneas luego de la línea de comienzo deseas ver. El número 2 significa cada segunda línea, 3 significa cada tercer línea, y así. | ||
Línea 84: | Línea 84: | ||
Normalmente no se conoce con precisión dónde se localiza exactamente un texto buscado, lo que implica que suele ser imposible proveer los números de línea. Sin embargo, podrás usar sed para seleccionar las líneas que contienen la cadena de texto que buscas. Por ejemplo, prueba extraer todas las líneas que comienzan con " | Normalmente no se conoce con precisión dónde se localiza exactamente un texto buscado, lo que implica que suele ser imposible proveer los números de línea. Sin embargo, podrás usar sed para seleccionar las líneas que contienen la cadena de texto que buscas. Por ejemplo, prueba extraer todas las líneas que comienzan con " | ||
- | El circunflejo (^) representa el comienzo de una línea. | + | El circunflejo ('' |
- | Al leer por primera ver guiones que incluyen sed, no suele resultar obvio. Recordemos que en los comandos anteriores expliqué que /p significa " | + | Al leer por primera ver guiones que incluyen sed, no suele resultar obvio. Recordemos que en los comandos anteriores expliqué que '' |
<file bash> | <file bash> | ||
Línea 94: | Línea 94: | ||
Como resultado, quince líneas que comienzan con " | Como resultado, quince líneas que comienzan con " | ||
- | === Realizar Sustiticiones === | + | ==== Realizar Sustiticiones |
En nuestro primer ejemplo, expuse el primer formato básico para usar la substitución en sed: | En nuestro primer ejemplo, expuse el primer formato básico para usar la substitución en sed: | ||
Línea 102: | Línea 102: | ||
</ | </ | ||
- | La s indica a sed que lo que viene a continuación es una sustitución lineal. La primer cadena consistirá en la cadena a buscar, mientras que la segunda cadena será el contenido quiere reemplazar. Por supuesto, como sucede en BSD, el demonio está en los detalles. | + | La '' |
Ingresa entonces el siguiente comando para cambiar todas las apariciones de la cadena " | Ingresa entonces el siguiente comando para cambiar todas las apariciones de la cadena " | ||
Línea 110: | Línea 110: | ||
</ | </ | ||
- | En la primer línea, sólo se cambiará la segunda ocurrencia de " | + | En la primer línea, sólo se cambiará la segunda ocurrencia de " |
<file bash> | <file bash> | ||
Línea 118: | Línea 118: | ||
Esto encontrará " | Esto encontrará " | ||
- | Para solucionar esto, ingresaremos el siguiente comando, agregándole una i al final de la expresión que le asigne a la orden insensibilidad a mayúsculas: | + | Para solucionar esto, ingresaremos el siguiente comando, agregándole una '' |
<file bash> | <file bash> | ||
Línea 126: | Línea 126: | ||
Esto funcionará, | Esto funcionará, | ||
- | Por ejemplo, si encierras los caracteres entre corchetes ([]), serán interpretados como " | + | Por ejemplo, si encierras los caracteres entre corchetes ('' |
Introduce lo siguiente para incluir " | Introduce lo siguiente para incluir " | ||
Línea 140: | Línea 140: | ||
</ | </ | ||
- | Busca ahora dos espacios y sustitúyelos por uno. Harás esto globalmente de manera que la acción se repita a lo largo de toda la primer línea. Para ser mas claro, la cadena de búsqueda es " | + | Busca ahora dos espacios y sustitúyelos por uno. Harás esto globalmente de manera que la acción se repita a lo largo de toda la primer línea. Para ser mas claro, la cadena de búsqueda es " |
Todo esto tendrá la forma del siguiente comando: | Todo esto tendrá la forma del siguiente comando: | ||
Línea 148: | Línea 148: | ||
</ | </ | ||
- | ¡Excelente! Lo que importa aquí es el patrón de búsqueda. El asterisco (*) representa cero o más del caracter precedente, que es un espacio. por ello, el patrón a buscar hará que sed analice cadenas de un espacio o más. | + | ¡Excelente! Lo que importa aquí es el patrón de búsqueda. El asterisco ('' |
- | Si sustituyes un espacio simple por cualquier secuencia múltiple de espacios, corregirás el fichero a un espaciado regular, con un espacio simple entre cada palabra. En realidad, esto también sustituirá el uso de espacios simples por otro espacio simple igual, y aunque no es adverso en el resultado, | + | Si sustituyes un espacio simple por cualquier secuencia múltiple de espacios, corregirás el fichero a un espaciado regular, con un espacio simple entre cada palabra. En realidad, esto también sustituirá el uso de espacios simples por otro espacio simple igual, y aunque no es adverso en el resultado, |
Si tipeas lo siguiente y reduces el patrón de búsqueda a un espacio simple, se hará inmediatamente evidente la necesidad de incluir los dos espacios: | Si tipeas lo siguiente y reduces el patrón de búsqueda a un espacio simple, se hará inmediatamente evidente la necesidad de incluir los dos espacios: | ||
Línea 160: | Línea 160: | ||
Como el asterisco busca cero o más del caracter precedente, interpretará cada caracter que no sea un espacio como un "cero espacio" | Como el asterisco busca cero o más del caracter precedente, interpretará cada caracter que no sea un espacio como un "cero espacio" | ||
- | Sin embargo, si incluyes dos espacios en la cadena de búsqueda, sed deberá encontrar al menos un caracter de espacio antes de aplicar la substitución. Esto asegurará que los caracteres que no son espacioes | + | Sin embargo, si incluyes dos espacios en la cadena de búsqueda, sed deberá encontrar |
- | El texto contiene dos errores. Si ingresas lo siguiente, usando la -e (expresión) que ya has utilizado anteriormente, | + | El texto contiene dos errores. Si ingresas lo siguiente, usando la '' |
<file bash> | <file bash> | ||
Línea 168: | Línea 168: | ||
</ | </ | ||
- | Podrás lograr el mismo resultado utilizando un punto y coma (;) para separar ambas expresiones, | + | Podrás lograr el mismo resultado utilizando un punto y coma ('' |
<file bash> | <file bash> | ||
Línea 190: | Línea 190: | ||
Esto te dará el resultado buscado. | Esto te dará el resultado buscado. | ||
- | === Sustituciones más complejas === | + | ==== Sustituciones más complejas |
- | Démosle un descanso a los alambrados y usemos ahora sed para extraer nombres del fichero / | + | Démosle un descanso a los alambrados y usemos ahora sed para extraer nombres del fichero |
- | Hay maneras más cortas de hacerlo (que se expondrán luego), pero usemos la forma más compleja para demostrar otro concepto. Cada ítem coincidente en un patrón de búsqueda (llamadas subexpresiones) puede recibir numeraciones (hasta un máximo de nueve ítems). Podrás utilizar dichos números en tus comandos de sed para referenciar subexpresiones específicas. | + | Hay maneras más cortas de hacerlo (que se expondrán luego), pero usemos la forma más compleja para demostrar otro concepto. Cada ítem coincidente en un patrón de búsqueda (llamadas |
- | Debes cerrar las subexpresiones entre paréntesis precedidas con una barra invertida (\) para que esto funcione. De lo contrario las subexpresiones serían interpretadas como un caracter normal. | + | Debes cerrar las subexpresiones entre paréntesis precedidas con una barra invertida ('' |
Para hacerlo, tipearás lo siguiente: | Para hacerlo, tipearás lo siguiente: | ||
Línea 206: | Línea 206: | ||
Desglosemos esto: | Desglosemos esto: | ||
- | * | + | * '' |
- | * \(: El paréntesis abierto [(] precedido por una barra invertida(\) abre una subexpresión. | + | * '' |
- | * | + | * '' |
- | * \): El paréntesis cerrado | + | * '' |
- | * .*: Esta segunda subexpresión de búsqueda significa " | + | * '' |
- | * /\1: La porción de sustitución de la expresión contiene 1 precedido por una barra invertida (\). Esto representa el texto que coincide con la primera subexpresión. | + | * '' |
- | * | + | * '' |
- | Lo que todo esto significa es que se buscará cualquier cadena de caracteres que no contienen un caracter de dos puntos (:), las cuales serán la primer instancia de un texto coincidente. Luego, se buscará cualquier cosa en dicha línea, la cual será la segunda instancia del texto coincidente. Se sustituirá la línea entera con el texto que está indicado en la primer subexpresión. | + | Lo que todo esto significa es que se buscará cualquier cadena de caracteres que no contienen un caracter de dos puntos ('' |
- | Cada línea del fichero /etc/passwd contiene con un nombre de usuario terminado por un caracter de dos puntos, y luego se sustituirá dicho valor por la línea entera. De esta forma, habremos aislados los nombre de usuario. | + | Cada línea del fichero |
Salida desde | Salida desde | ||
- | A continuación, | + | A continuación, |
Para ello ingresa: | Para ello ingresa: | ||
Línea 230: | Línea 230: | ||
Estos cambios pequeños dan por invertir el significado de todo el comando, por lo cual recibiremos todo excepto los nombres de usuarios. | Estos cambios pequeños dan por invertir el significado de todo el comando, por lo cual recibiremos todo excepto los nombres de usuarios. | ||
- | Ahora, | + | Ahora, |
- | Nuestro término de busqueda | + | Nuestro término de búsqueda |
- | De modo que si tipeamos lo siguiente, quitando todo desde el primer caracter de dos puntos (:) hasta el final de la línea, se logrará el efecto anterior de dejar sólo los nombres de usuario: | + | De modo que si tipeamos lo siguiente, quitando todo desde el primer caracter de dos puntos ('' |
<file bash> | <file bash> | ||
Línea 242: | Línea 242: | ||
Ahora miremos un ejemplo en el cual referenciamos la primer y segunda coincidencia el mismo comando. | Ahora miremos un ejemplo en el cual referenciamos la primer y segunda coincidencia el mismo comando. | ||
- | Tenemos un fichero donde comas (,) separan el nombre y el apellido. Deseamos listarlos como " | + | Tenemos un fichero donde comas ('' |
<file bash> | <file bash> | ||
Línea 256: | Línea 256: | ||
Se trata de un comando de sustitución como los anteriores, y la cadena de búsqueda es bastante simple. Desglosémoslo: | Se trata de un comando de sustitución como los anteriores, y la cadena de búsqueda es bastante simple. Desglosémoslo: | ||
- | * sed 's/: El comando de sustitución normal. | + | * '' |
- | * ^: Como el circunflejo no está en un grupo ([]), se interpreta como "el comienzo de la línea" | + | * '' |
- | * | + | * '' |
- | * | + | * '' |
- | * $/: El signo peso ($) representa el fin de la línea y permitirá a nuestra búsqueda continuar hasta el final de la línea. Se usa esto simplemente para presentar aquí el signo peso. Realmente no se necesita, ya que el asterisco (*) haría llegar hasta el final de la lónea en este escenario. La barra (/) completa la búsqueda de la cadena. | + | * '' |
- | * | + | * '' |
- | * /g: Esto activa la operación global en cada línea. | + | * '' |
- | * | + | * '' |
- | También puedes usar el comando Cortar (c) para sustituir líneas entera que coincidan con la cadena de búsqueda propuesta. Tipearemos lo siguiente para buscar una línea con la palabra " | + | También puedes usar el comando Cortar ('' |
<file bash> | <file bash> | ||
Línea 274: | Línea 274: | ||
Insertar Líneas y Texto | Insertar Líneas y Texto | ||
- | También podremos insertar nuevas líneas y texto en nuestro fichero. Para insertar líneas nuevas a continuación de cualquieras que coincidan, usaremos el comando Agregar (a). | + | También podremos insertar nuevas líneas y texto en nuestro fichero. Para insertar líneas nuevas a continuación de cualquieras que coincidan, usaremos el comando Agregar ('' |
He aquí el fichero con el que queremos trabajar: | He aquí el fichero con el que queremos trabajar: | ||
Línea 290: | Línea 290: | ||
</ | </ | ||
- | Tipea lo siguiente e incluye el comando Insertar (i) para insertar la nueva línea por encima de aquellas que contienen el texto coincidente: | + | Tipea lo siguiente e incluye el comando Insertar ('' |
<file bash> | <file bash> | ||
Línea 296: | Línea 296: | ||
</ | </ | ||
- | Podemos usar el caracter et o ampersand ("&"), que representa al texto coincidente original, para agregar una cadena de texto nuevo a la línea coincidente. \1 , \2 y demás, representan las subexpresiones coincidentes. | + | Podemos usar el caracter et o ampersand ('' |
Para agregar texto al comienzo de una línea, se utiliza un comando de sustitución que haga coincidir todo en la línea, combinado con una cláusula de reemplazo que combine nuestro nuevo texto con la línea original. | Para agregar texto al comienzo de una línea, se utiliza un comando de sustitución que haga coincidir todo en la línea, combinado con una cláusula de reemplazo que combine nuestro nuevo texto con la línea original. | ||
Línea 312: | Línea 312: | ||
</ | </ | ||
- | Si deseas agregar dos, o tres líneas en blanco, puedes usar G;G, G,G,G, y así. | + | Si deseas agregar dos, o tres líneas en blanco, puedes usar '' |
- | Borrar líneas | + | ====Borrar líneas==== |
- | El comando Borrar (d) borra las líneas que coincidan con el patrón de búsqueda, o aquellas líneas especificadas números de líneas o rangos de líneas. | + | El comando Borrar ('' |
Por ejemplo, para borrar la tercer línea, tipearíamos lo siguiente: | Por ejemplo, para borrar la tercer línea, tipearíamos lo siguiente: | ||
Línea 343: | Línea 343: | ||
Es una buena política instruir a sed para que cree una copia de respaldo del fichero original antes de ejecutar cualquier comando. | Es una buena política instruir a sed para que cree una copia de respaldo del fichero original antes de ejecutar cualquier comando. | ||
- | Puedes usar la opción En el Lugar (-i) para indicar a sed que escriba los cambios al fichero original, pero si le agregas una extensión de archivo, sed procederá a respaldar el fichero original con dicha extensión. Tendrá el mismo nombre que el fichero original, pero con una nueva extensión. | + | Puedes usar la opción En el Lugar ('' |
- | Para demostrarlo, | + | Para demostrarlo, |
Para hacerlo así, ingresa lo siguiente: | Para hacerlo así, ingresa lo siguiente: |