No importa si es un administrador del sistema o un simple entusiasta, es probable que necesite trabajar con documentos de texto con frecuencia. Linux, como otros Unices, proporciona algunas de las mejores utilidades de manipulación de texto para los usuarios finales.
La utilidad de línea de comandos sed es una de esas herramientas que hace que el procesamiento de texto sea mucho más conveniente y productivo. Si eres un usuario experimentado, ya deberías saber sobre sed. Sin embargo, los principiantes a menudo sienten que el aprendizaje requiere un trabajo extra duro y, por lo tanto, se abstienen de usar esta herramienta fascinante. Es por eso que nos hemos comprometido a producir esta guía y ayudarlos a aprender los conceptos básicos de sed lo más fácilmente posible.
Sed es una de las tres utilidades de filtrado ampliamente utilizadas disponibles en Unix, las otras son «grep y awk». Ya hemos cubierto el comando grep de Linux y el comando awk para principiantes . Esta guía tiene como objetivo concluir la utilidad sed para usuarios novatos y hacerlos expertos en el procesamiento de texto utilizando Linux y otros Unices.
Contenidos
Cómo funciona SED: una comprensión básica
Antes de profundizar en los ejemplos directamente, debe tener una comprensión concisa de cómo funciona sed en general. Sed es un editor de flujo, construido sobre la utilidad ed . Nos permite realizar cambios de edición en una secuencia de datos textuales. Aunque podemos usar varios editores de texto de Linux para editar, sed permite algo más conveniente.
Puede usar sed para transformar texto o filtrar datos esenciales sobre la marcha. Se adhiere a la filosofía central de Unix al realizar esta tarea específica muy bien. Además, sed juega muy bien con herramientas y comandos de terminal Linux estándar. Por lo tanto, es más adecuado para muchas tareas sobre los editores de texto tradicionales.
principio de funcionamiento de sed
En esencia, sed toma algo de entrada, realiza algunas manipulaciones y escupe la salida. No cambia la entrada sino que simplemente muestra el resultado en la salida estándar. Fácilmente podemos hacer que estos cambios sean permanentes ya sea por redireccionamiento de E / S o modificando el archivo original. La sintaxis básica de un comando sed se muestra a continuación.
sed [OPTIONS] INPUT sed 'list of ed commands' filename
La primera línea es la sintaxis que se muestra en el manual de sed. El segundo es más fácil de entender. No se preocupe si no está familiarizado con los comandos ed en este momento. Los aprenderá a lo largo de esta guía.
1. Sustitución de la entrada de texto
El comando sustituto es la característica más utilizada de sed para muchos usuarios. Nos permite reemplazar una porción de texto con otros datos. Muy a menudo utilizará este comando para procesar datos textuales. Funciona de la siguiente manera.
$ echo 'Hello world!' | sed 's/world/universe/'
Este comando generará la cadena ‘¡Hola universo!’. Tiene cuatro partes básicas. El comando ‘s’ denota la operación de sustitución, /../../ son delimitadores, la primera parte dentro de los delimitadores es el patrón que debe cambiarse, y la última parte es la cadena de reemplazo.
2. Sustitución de entrada de texto de archivos
Primero creemos un archivo usando lo siguiente.
$ echo 'strawberry fields forever...' >> input-file $ cat input-file
Ahora, digamos que queremos reemplazar la fresa con el arándano. Podemos hacerlo usando el siguiente comando simple. Tenga en cuenta las similitudes entre la parte sed de este comando y el anterior.
$ sed 's/strawberry/blueberry/' input-file
Simplemente agregamos el nombre del archivo después de la porción sed. También puede generar primero el contenido del archivo y luego usar sed para editar la secuencia de salida, como se muestra a continuación.
$ cat input-file | sed 's/strawberry/blueberry/'
3. Guardar cambios en archivos
Como ya hemos mencionado, sed no cambia los datos de entrada en absoluto. Simplemente muestra los datos transformados a la salida estándar, que resulta ser el terminal de Linux por defecto. Puede verificar esto ejecutando el siguiente comando.
$ cat input-file
Esto mostrará el contenido original del archivo. Sin embargo, supongamos que desea que sus cambios sean permanentes. Puedes hacer esto de múltiples maneras. El método estándar es redirigir su salida sed a otro archivo. El siguiente comando guarda la salida del comando sed anterior en un archivo llamado archivo de salida.
$ sed 's/strawberry/blueberry/' input-file >> output-file
Puede verificar esto utilizando el siguiente comando.
$ cat output-file
4. Guardar cambios en el archivo original
¿Qué sucede si desea guardar la salida de sed en el archivo original? Es posible hacerlo utilizando la opción -i o –in situ de esta herramienta. Los siguientes comandos demuestran esto usando ejemplos apropiados.
$ sed -i 's/strawberry/blueberry' input-file $ sed --in-place 's/strawberry/blueberry/' input-file
Los dos comandos anteriores son equivalentes y escriben los cambios realizados por sed en el archivo original. Sin embargo, si está pensando en redirigir la salida al archivo original, no funcionará como se esperaba.
$ sed 's/strawberry/blueberry/' input-file > input-file
Este comando no funcionará y dará como resultado un archivo de entrada vacío. Esto se debe a que el shell realiza la redirección antes de ejecutar el comando en sí.
5. Delimitadores de escape
Muchos ejemplos sed convencionales usan el carácter ‘/’ como sus delimitadores. Sin embargo, ¿qué sucede si desea reemplazar una cadena que contiene este carácter? El siguiente ejemplo ilustra cómo reemplazar una ruta de nombre de archivo usando sed. Tendremos que escapar de los delimitadores ‘/’ utilizando el carácter de barra diagonal inversa.
$ echo '/usr/local/bin/dummy' >> input-file $ sed 's/\/usr\/local\/bin\/dummy/\/usr\/bin\/dummy/' input-file > output-file
Otra forma fácil de escapar de los delimitadores es usar un metacarácter diferente. Por ejemplo, podríamos usar ‘_’ en lugar de ‘/’ como delimitadores del comando de sustitución. Es perfectamente válido ya que sed no exige ningún delimitador específico. El ‘/’ se usa por convención, no como un requisito.
$ sed 's_/usr/local/bin/dummy_/usr/bin/dummy/_' input-file
6. Sustituyendo cada instancia de una cadena
Una característica interesante del comando de sustitución es que, por defecto, solo reemplazará una sola instancia de una cadena en cada línea.
$ cat << EOF >> input-file one two one three two four two three one four EOF
Este comando reemplazará el contenido del archivo de entrada con algunos números aleatorios en un formato de cadena. Ahora, mira el siguiente comando.
$ sed 's/one/ONE/' input-file
Como debería ver, este comando solo reemplaza la primera aparición de ‘uno’ en la primera línea. Debe usar la sustitución global para reemplazar todas las apariciones de una palabra usando sed. Simplemente agregue una ‘g’ después del delimitador final de ‘s ‘.
$ sed 's/one/ONE/g' input-file
Esto sustituirá todas las apariciones de la palabra ‘uno’ a lo largo de la secuencia de entrada.
sustituir todos los patrones usando el comando sed
7. Usando una cadena combinada
A veces, los usuarios pueden querer agregar ciertas cosas como paréntesis o citas alrededor de una cadena específica. Esto es fácil de hacer si sabe exactamente lo que está buscando. Sin embargo, ¿qué pasa si no sabemos exactamente qué encontraremos? La utilidad sed proporciona una pequeña y agradable característica para hacer coincidir dicha cadena.
$ echo 'one two three 123' | sed 's/123/(123)/'
Aquí, estamos agregando paréntesis alrededor del 123 usando el comando de sustitución de sed. Sin embargo, podemos hacer esto para cualquier cadena en nuestra secuencia de entrada utilizando el metacarácter especial & , como se ilustra en el siguiente ejemplo.
$ echo 'one two three 123' | sed 's/[a-z][a-z]*/(&)/g'
Este comando agregará paréntesis alrededor de todas las palabras en minúscula en nuestra entrada. Si omite la opción ‘g’ , sed lo hará solo por la primera palabra, no por todas.
8. Uso de expresiones regulares extendidas
En el comando anterior, hemos hecho coincidir todas las palabras en minúsculas con la expresión regular [az] [az] *. Coincide con una o más letras minúsculas. Otra forma de unirlos sería usar el metacaracteres ‘+’ . Este es un ejemplo de expresiones regulares extendidas. Por lo tanto, sed no los admitirá por defecto.
$ echo 'one two three 123' | sed 's/[a-z]+/(&)/g'
Este comando no funciona según lo previsto, ya que sed no admite el metacarácter ‘+’ fuera de la caja. Debe usar las opciones -E o -r para habilitar expresiones regulares extendidas en sed.
$ echo 'one two three 123' | sed -E 's/[a-z]+/(&)/g' $ echo 'one two three 123' | sed -r 's/[a-z]+/(&)/g'
9. Realizar múltiples sustituciones
Podemos usar más de un comando sed de una sola vez separándolos por ‘;’ (punto y coma). Esto es muy útil ya que permite al usuario crear combinaciones de comandos más robustas y reducir molestias adicionales sobre la marcha. El siguiente comando nos muestra cómo sustituir tres cadenas de una vez usando este método.
$ echo 'one two three' | sed 's/one/1/; s/two/2/; s/three/3/'
Hemos utilizado este sencillo ejemplo para ilustrar cómo realizar múltiples sustituciones o cualquier otra operación sed para el caso.
10. Sustituyendo el caso insensiblemente
La utilidad sed nos permite reemplazar cadenas de una manera que no distinga entre mayúsculas y minúsculas. Primero, veamos cómo sed realiza la siguiente operación de reemplazo simple.
$ echo 'one ONE OnE' | sed 's/one/1/g' # replaces single one
El comando de sustitución solo puede coincidir con una instancia de ‘uno’ y, por lo tanto, reemplazarlo. Sin embargo, digamos que queremos que coincida con todas las ocurrencias de ‘uno’, independientemente de su caso. Podemos abordar esto usando la bandera ‘i’ de la operación de sustitución de sed.
$ echo 'one ONE OnE' | sed 's/one/1/gi' # replaces all ones
11. Imprimir líneas específicas
Podemos ver una línea específica desde la entrada usando el comando ‘p’ . Agreguemos un poco más de texto a nuestro archivo de entrada y demostremos este ejemplo.
$ echo 'Adding some more text to input file for better demonstration' >> input-file
Ahora, ejecute el siguiente comando para ver cómo imprimir una línea específica usando ‘p’.
$ sed '3p; 6p' input-file
La salida debe contener la línea número tres y seis dos veces. Esto no es lo que esperábamos, ¿verdad? Esto sucede porque, de forma predeterminada, sed genera todas las líneas de la secuencia de entrada, así como las líneas, preguntadas específicamente. Para imprimir solo las líneas específicas, debemos suprimir todas las demás salidas.
$ sed -n '3p; 6p' input-file $ sed --quiet '3p; 6p' input-file $ sed --silent '3p; 6p' input-file
Todos estos comandos sed son equivalentes e imprime solo la tercera y sexta línea de nuestro archivo de entrada. Por lo tanto, puede suprimir la salida no deseada utilizando una de las opciones -n , –quiet o –silent .
12. Rango de impresión de líneas
El siguiente comando imprimirá un rango de líneas desde nuestro archivo de entrada. El símbolo ‘,’ se puede usar para especificar un rango de entrada para sed.
$ sed -n '2,4p' input-file $ sed --quiet '2,4p' input-file $ sed --silent '2,4p' input-file
Todos estos tres comandos son equivalentes también. Imprimirán las líneas dos a cuatro de nuestro archivo de entrada.
imprimir rango de líneas
13. Impresión de líneas no consecutivas
Suponga que desea imprimir líneas específicas de su entrada de texto usando un solo comando. Puede manejar tales operaciones de dos maneras. El primero es unir múltiples operaciones de impresión usando ‘;’ separador.
$ sed -n '1,2p; 5,6p' input-file
Este comando imprime las dos primeras líneas del archivo de entrada seguido de las dos últimas líneas. También puede hacerlo utilizando la opción -e de sed. Observe las diferencias en la sintaxis.
$ sed -n -e '1,2p' -e '5,6p' input-file
14. Imprimir cada línea N-ésima
Digamos que queríamos mostrar cada segunda línea de nuestro archivo de entrada. La utilidad sed hace esto muy fácil al proporcionar el operador tilde ‘~’ . Eche un vistazo rápido al siguiente comando para ver cómo funciona esto.
$ sed -n '1~2p' input-file
Este comando funciona imprimiendo la primera línea seguida de cada segunda línea de la entrada. El siguiente comando imprime la segunda línea seguida de cada tercera línea desde la salida de un simple comando ip.
$ ip -4 a | sed -n '2~3p'
15. Sustitución de texto dentro de un rango
También podemos reemplazar parte del texto solo dentro de un rango específico de la misma manera que lo imprimimos. El siguiente comando muestra cómo sustituir los ‘unos con 1’ en las primeras tres líneas de nuestro archivo de entrada usando sed.
$ sed '1,3 s/one/1/gi' input-file
Este comando no afectará a ningún otro. Agregue algunas líneas que contengan una a este archivo e intente verificarlo usted mismo.
16. Eliminar líneas de entrada
El comando ed ‘d’ nos permite eliminar líneas específicas o un rango de líneas del flujo de texto o de los archivos de entrada. El siguiente comando muestra cómo eliminar la primera línea de la salida de sed.
$ sed '1d' input-file
Dado que sed solo escribe en la salida estándar, esta eliminación no se reflejará en el archivo original. Se puede usar el mismo comando para eliminar la primera línea de una secuencia de texto multilínea.
$ ps | sed '1d'
Entonces, simplemente usando el comando ‘d’ después de la dirección de línea, podemos suprimir la entrada para sed.
17. Eliminar rango de líneas de entrada
También es muy fácil eliminar un rango de líneas usando el operador ‘,’ junto con la opción ‘d’ . El siguiente comando sed suprimirá las primeras tres líneas de nuestro archivo de entrada.
$ sed '1,3d' input-file
También podemos eliminar líneas no consecutivas usando uno de los siguientes comandos.
$ sed '1d; 3d; 5d' input-file
Este comando muestra la segunda, cuarta y última línea de nuestro archivo de entrada. El siguiente comando omite algunas líneas arbitrarias de la salida de un simple comando ip de Linux.
$ ip -4 a | sed '1d; 3d; 4d; 6d'
18. Eliminar la última línea
La utilidad sed tiene un mecanismo simple que nos permite eliminar la última línea de una secuencia de texto o un archivo de entrada. Es el símbolo ‘$’ y también se puede usar para otros tipos de operaciones junto con la eliminación. El siguiente comando elimina la última línea del archivo de entrada.
$ sed '$d' input-file
Esto es muy útil ya que a menudo podemos saber de antemano el número de líneas. Esto funciona de manera similar para las entradas de tubería.
$ seq 3 | sed '$d'
19. Eliminar todas las líneas excepto las específicas
Otro ejemplo práctico de eliminación de sed es eliminar todas las líneas excepto las que se especifican en el comando. Esto es útil para filtrar información esencial de secuencias de texto o resultados de otros comandos de terminal de Linux .
$ free | sed '2!d'
Este comando solo generará el uso de memoria, que está en la segunda línea. También puede hacer lo mismo con los archivos de entrada, como se muestra a continuación.
$ sed '1,3!d' input-file
Este comando elimina todas las líneas excepto las tres primeras del archivo de entrada.
20. Agregar líneas en blanco
A veces, la secuencia de entrada puede estar demasiado concentrada. Puede usar la utilidad sed para agregar líneas en blanco entre la entrada en tales casos. El siguiente ejemplo agrega una línea en blanco entre cada línea de la salida del comando ps.
$ ps aux | sed 'G'
El comando ‘G’ agrega esta línea en blanco. Puede agregar varias líneas en blanco utilizando más de un comando ‘G’ para sed.
$ sed 'G; G' input-file
El siguiente comando le muestra cómo agregar una línea en blanco después de un número de línea específico. Agregará una línea en blanco después de la tercera línea de nuestro archivo de entrada.
$ sed '3G' input-file
21. Sustitución de texto en líneas específicas
La utilidad sed permite a los usuarios sustituir parte del texto en una línea particular. Esto es útil en varios escenarios diferentes. Digamos que queremos reemplazar la palabra ‘uno’ en la tercera línea de nuestro archivo de entrada. Podemos usar el siguiente comando para hacer esto.
$ sed '3 s/one/1/' input-file
El ‘3’ antes del comienzo del comando ‘s’ especifica que solo queremos reemplazar la palabra que se encuentra en la tercera línea.
22. Sustituyendo la enésima palabra de una cadena
También podemos usar el comando sed para reemplazar la n-ésima ocurrencia de un patrón para una cadena dada. El siguiente ejemplo ilustra esto usando un solo ejemplo de una línea en bash.
$ echo 'one one one one one one' | sed 's/one/1/3'
Este comando reemplazará el tercer ‘uno’ con el número 1. Esto funciona de la misma manera para los archivos de entrada. El siguiente comando sustituye los últimos ‘dos’ de la segunda línea del archivo de entrada.
$ cat input-file | sed '2 s/two/2/2'
Primero seleccionamos la segunda línea y luego especificamos qué ocurrencia del patrón a cambiar.
23. Agregar nuevas líneas
Puede agregar fácilmente nuevas líneas a la secuencia de entrada utilizando el comando ‘a’ . Mira el ejemplo simple a continuación para ver cómo funciona esto.
$ sed 'a new line in input' input-file
El comando anterior agregará la cadena ‘nueva línea de entrada’ después de cada línea del archivo de entrada original. Sin embargo, esto podría no ser lo que pretendías. Puede agregar nuevas líneas después de una línea específica utilizando la siguiente sintaxis.
$ sed '3 a new line in input' input-file
24. Insertar nuevas líneas
También podemos insertar líneas en lugar de agregarlas. El siguiente comando inserta una nueva línea antes de cada línea de entrada.
$ seq 5 | sed 'i 888'
El comando ‘i’ hace que la cadena 888 se inserte antes de cada línea de la salida de seq. Para insertar una línea antes de una línea de entrada específica, use la siguiente sintaxis.
$ seq 5 | sed '3 i 333'
Este comando agregará el número 333 antes de la línea que realmente contiene tres. Estos son ejemplos simples de inserción de línea. Puede agregar cadenas fácilmente haciendo coincidir líneas con patrones.
25. Cambio de líneas de entrada
También podemos cambiar las líneas de una secuencia de entrada directamente usando el comando ‘c’ de la utilidad sed. Esto es útil cuando sabe exactamente qué línea reemplazar y no desea hacer coincidir la línea usando expresiones regulares. El siguiente ejemplo cambia la tercera línea de la salida del comando seq.
$ seq 5 | sed '3 c 123'
Reemplaza el contenido de la tercera línea, que es 3, con el número 123. El siguiente ejemplo nos muestra cómo cambiar la última línea de nuestro archivo de entrada usando ‘c’ .
$ sed '$ c CHANGED STRING' input-file
También podemos usar expresiones regulares para seleccionar el número de línea a cambiar. El siguiente ejemplo ilustra esto.
$ sed '/demo*/ c CHANGED TEXT' input-file
26. Crear archivos de respaldo para entrada
Si desea transformar algo de texto y guardar los cambios nuevamente en el archivo original, le recomendamos que cree archivos de respaldo antes de continuar. El siguiente comando realiza algunas operaciones sed en nuestro archivo de entrada y lo guarda como el original. Además, crea una copia de seguridad llamada input-file.old como medida de precaución.
$ sed -i.old 's/one/1/g; s/two/2/g; s/three/3/g' input-file
La opción -i escribe los cambios realizados por sed en el archivo original. La parte del sufijo .old es responsable de crear el documento input-file.old.
27. Imprimir líneas basadas en patrones
Digamos que queremos imprimir todas las líneas desde una entrada basada en un patrón determinado. Esto es bastante fácil cuando combinamos los comandos sed ‘p’ con la opción -n . El siguiente ejemplo ilustra esto usando el archivo de entrada.
$ sed -n '/^for/ p' input-file
Este comando busca el patrón ‘para’ al comienzo de cada línea e imprime solo las líneas que comienzan con él. El carácter ‘^’ es un carácter especial de expresión regular conocido como un ancla. Especifica que el patrón debe ubicarse al comienzo de la línea.
28. Uso de SED como alternativa al GREP
El comando grep en Linux busca un patrón particular en un archivo y, si se encuentra, muestra la línea. Podemos emular este comportamiento usando la utilidad sed. El siguiente comando ilustra esto usando un ejemplo simple.
$ sed -n 's/strawberry/&/p' /usr/share/dict/american-english
Este comando localiza la palabra fresa en el archivo de diccionario inglés americano . Funciona buscando el patrón fresa y luego usa una cadena coincidente junto con el comando ‘p’ para imprimirlo. El distintivo -n suprime todas las demás líneas en la salida. Podemos hacer este comando más simple usando la siguiente sintaxis.
$ sed -n '/strawberry/p' /usr/share/dict/american-english
alternativa grep usando el comando sed
29. Agregar texto de archivos
El comando ‘r’ de la utilidad sed nos permite agregar texto leído desde un archivo a la secuencia de entrada. El siguiente comando genera una secuencia de entrada para sed utilizando el comando seq y agrega los textos contenidos por el archivo de entrada a esta secuencia.
$ seq 5 | sed 'r input-file'
Este comando agregará el contenido del archivo de entrada después de cada secuencia de entrada consecutiva producida por seq. Use el siguiente comando para agregar el contenido después de los números generados por seq.
$ seq 5 | sed '$ r input-file'
Puede usar el siguiente comando para agregar el contenido después de la enésima línea de entrada.
$ seq 5 | sed '3 r input-file'
30. Escribir modificaciones en archivos
Supongamos que tenemos un archivo de texto que contiene una lista de direcciones web. Digamos, algunos de ellos comienzan con www, algunos https y otros http. Podemos cambiar todas las direcciones que comienzan con www para comenzar con https y guardar solo las que se modificaron en un archivo completamente nuevo.
$ sed 's/www/https/ w modified-websites' websites
Ahora, si inspecciona el contenido del archivo de sitios web modificados, encontrará solo las direcciones que fueron cambiadas por sed. La opción ‘w filename ‘ hace que sed escriba las modificaciones al nombre de archivo especificado. Es útil cuando se trata de archivos grandes y desea almacenar los datos modificados por separado.
31. Uso de archivos de programa SED
A veces, es posible que deba realizar una serie de operaciones sed en un conjunto de entrada dado. En tales casos, es mejor escribir un archivo de programa que contenga todos los diferentes scripts sed. Luego puede simplemente invocar este archivo de programa utilizando la opción -f de la utilidad sed.
$ cat << EOF >> sed-script s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g EOF
Este programa sed cambia todas las vocales en minúsculas a mayúsculas. Puede ejecutar esto utilizando la siguiente sintaxis.
$ sed -f sed-script input-file $ sed --file=sed-script < input-file
32. Uso de comandos SED multilínea
Si está escribiendo un programa sed grande que se extiende sobre varias líneas, deberá citarlas correctamente. La sintaxis difiere ligeramente entre diferentes shells de Linux . Afortunadamente, es muy simple para el caparazón de bourne y sus derivados (bash).
$ sed ' s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g' < input-file
En algunos shells, como el shell C (csh), debe proteger las comillas utilizando el carácter de barra diagonal inversa (\).
$ sed 's/a/A/g \ s/e/E/g \ s/i/I/g \ s/o/O/g \ s/u/U/g' < input-file
33. Imprimir números de línea
Si desea imprimir el número de línea que contiene una cadena específica, puede buscarlo usando un patrón e imprimirlo muy fácilmente. Para esto, deberá utilizar el comando ‘=’ de la utilidad sed.
$ sed -n '/ion*/ =' < input-file
Este comando buscará el patrón dado en el archivo de entrada e imprimirá su número de línea en la salida estándar. También puede usar una combinación de grep y awk para abordar esto.
$ cat -n input-file | grep 'ion*' | awk '{print $1}'
Puede usar el siguiente comando para imprimir el número total de líneas en su entrada.
$ sed -n '$=' input-file
34. Prevención de sobrescritura de enlaces simbólicos
El comando sed ‘i’ o ‘–in-place ‘ a menudo sobrescribe cualquier enlace del sistema con archivos normales. Esta es una situación no deseada en muchos casos y, por lo tanto, los usuarios pueden querer evitar que esto suceda. Afortunadamente, sed proporciona una opción de línea de comandos simple para deshabilitar la sobrescritura de enlaces simbólicos.
$ echo 'apple' > fruit $ ln --symbolic fruit fruit-link $ sed --in-place --follow-symlinks 's/apple/banana/' fruit-link $ cat fruit
Por lo tanto, puede evitar la sobrescritura simbólica de enlaces utilizando la opción –follow-symlinks de la utilidad sed. De esta manera, puede preservar los enlaces simbólicos mientras realiza el procesamiento de texto.
35. Impresión de todos los nombres de usuario desde / etc / passwd
El archivo / etc / passwd contiene información de todo el sistema para todas las cuentas de usuario en Linux. Podemos obtener una lista de todos los nombres de usuario disponibles en este archivo mediante el uso de un simple programa de sed de una línea. Observe de cerca el ejemplo a continuación para ver cómo funciona esto.
$ sed 's/\([^:]*\).*/\1/' /etc/passwd
Hemos utilizado un patrón de expresión regular para obtener el primer campo de este archivo mientras descartamos toda otra información. Aquí es donde residen los nombres de usuario en el archivo / etc / passwd .
36. Eliminar líneas comentadas de la entrada
Muchas herramientas del sistema, así como aplicaciones de terceros, vienen con archivos de configuración. Estos archivos generalmente contienen muchos comentarios que describen los parámetros en detalle. Sin embargo, a veces es posible que desee mostrar solo las opciones de configuración mientras mantiene los comentarios originales en su lugar.
$ cat ~/.bashrc | sed -e 's/#.*//;/^$/d'
Este comando elimina las líneas comentadas del archivo de configuración bash. Los comentarios están marcados con un signo ‘#’ anterior. Entonces, hemos eliminado todas esas líneas usando un patrón de expresión regular simple. Si los comentarios están marcados con un símbolo diferente, reemplace el ‘#’ en el patrón anterior con ese símbolo específico.
$ cat ~/.vimrc | sed -e 's/".*//;/^$/d'
Esto eliminará los comentarios del archivo de configuración de vim, que comienza con un símbolo de comillas dobles («).
eliminar comentarios
37. Eliminar espacios en blanco de la entrada
Muchos documentos de texto están llenos de espacios en blanco innecesarios. A menudo son el resultado de un formato deficiente y pueden estropear los documentos en general. Afortunadamente, sed permite a los usuarios eliminar estos espacios no deseados con bastante facilidad. Puede usar el siguiente comando para eliminar espacios en blanco iniciales de una secuencia de entrada.
$ sed 's/^[ \t]*//' whitespace.txt
Este comando eliminará todos los espacios en blanco iniciales del archivo whitespace.txt. Si desea eliminar espacios en blanco al final, use el siguiente comando en su lugar.
$ sed 's/[ \t]*$//' whitespace.txt
También puede usar el comando sed para eliminar los espacios en blanco iniciales y finales al mismo tiempo. El siguiente comando se puede utilizar para realizar esta tarea.
$ sed 's/^[ \t]*//;s/[ \t]*$//' whitespace.txt
38. Crear compensaciones de página con SED
Si tiene un archivo grande con cero rellenos frontales, es posible que desee crear algunos desplazamientos de página para él. Los desplazamientos de página son simplemente espacios en blanco que nos ayudan a leer las líneas de entrada sin esfuerzo. El siguiente comando crea un desplazamiento de 5 espacios en blanco.
$ sed 's/^/ /' input-file
Simplemente aumente o reduzca el espacio para especificar un desplazamiento diferente. El siguiente comando reduce el desplazamiento de la página en 3 líneas en blanco.
$ sed 's/^/ /' input-file
39. Inversión de líneas de entrada
El siguiente comando nos muestra cómo usar sed para invertir el orden de las líneas en un archivo de entrada. Emula el comportamiento del comando tac de Linux .
$ sed '1!G;h;$!d' input-file
Este comando invierte las líneas del documento de línea de entrada. También se puede hacer usando un método alternativo.
$ sed -n '1!G;h;$p' input-file
40. Inversión de caracteres de entrada
También podemos usar la utilidad sed para invertir los caracteres en las líneas de entrada. Esto invertirá el orden de cada carácter consecutivo en la secuencia de entrada.
$ sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' input-file
Este comando emula el comportamiento del comando Linux rev . Puede verificar esto ejecutando el siguiente comando después del anterior.
$ rev input-file
41. Unir pares de líneas de entrada
El siguiente comando sed simple une dos líneas consecutivas de un archivo de entrada como una sola línea. Es útil cuando tiene un texto grande que contiene líneas divididas.
$ sed '$!N;s/\n/ /' input-file $ tail -15 /usr/share/dict/american-english | sed '$!N;s/\n/ /'
Es útil en una serie de tareas de manipulación de texto.
42. Agregar líneas en blanco en cada enésima línea de entrada
Puede agregar una línea en blanco en cada enésima línea del archivo de entrada muy fácilmente usando sed. Los siguientes comandos agregan una línea en blanco en cada tercera línea del archivo de entrada.
$ sed 'n;n;G;' input-file
Use lo siguiente para agregar la línea en blanco en cada segunda línea.
$ sed 'n;G;' input-file
43. Imprimir las últimas líneas n.
Anteriormente, hemos utilizado comandos sed para imprimir líneas de entrada en función del número de línea, los rangos y el patrón. También podemos usar sed para emular el comportamiento de los comandos head o tail. El siguiente ejemplo imprime las últimas 3 líneas del archivo de entrada.
$ sed -e :a -e '$q;N;4,$D;ba' input-file
Es similar al siguiente comando de cola tail -3 input-file
44. Imprimir líneas que contienen un número específico de caracteres
Es muy fácil imprimir líneas según el recuento de caracteres. El siguiente comando simple imprimirá líneas que tengan 15 o más caracteres.
$ sed -n '/^.\{15\}/p' input-file
Use el siguiente comando para imprimir líneas que tengan menos de 20 caracteres.
$ sed -n '/^.\{20\}/!p' input-file
También podemos hacer esto de una manera más simple usando el siguiente método.
$ sed '/^.\{20\}/d' input-file
imprimir líneas basadas en caracteres
45. Eliminar líneas duplicadas
El siguiente ejemplo de sed nos muestra que emulemos el comportamiento del comando uniq de Linux . Elimina dos líneas duplicadas consecutivas de la entrada.
$ sed '$!N; /^\(.*\)\n\1$/!P; D' input-file
Sin embargo, sed no puede eliminar todas las líneas duplicadas si la entrada no está ordenada. Aunque puede ordenar el texto usando el comando ordenar y luego conectar la salida a sed usando una tubería, cambiará la orientación de las líneas.
46. Eliminar todas las líneas en blanco
Si su archivo de texto contiene muchas líneas en blanco innecesarias, puede eliminarlas usando la utilidad sed. El siguiente comando demuestra esto.
$ sed '/^$/d' input-file $ sed '/./!d' input-file
Ambos comandos eliminarán las líneas en blanco presentes en el archivo especificado.
47. Eliminar las últimas líneas de párrafos
Puede eliminar la última línea de todos los párrafos con el siguiente comando sed. Utilizaremos un nombre de archivo ficticio para este ejemplo. Reemplace esto con el nombre de un archivo real que contiene algunos párrafos.
$ sed -n '/^$/{p;h;};/./{x;/./p;}' paragraphs.txt
48. Visualización de la página de ayuda
La página de ayuda contiene información resumida sobre todas las opciones disponibles y el uso del programa sed. Puede invocar esto utilizando la siguiente sintaxis.
$ sed -h $ sed --help
Puede usar cualquiera de estos dos comandos para encontrar una descripción general agradable y compacta de la utilidad sed.
49. Visualización de la página del manual
La página del manual proporciona una discusión en profundidad de sed, su uso y todas las opciones disponibles. Debe leer esto detenidamente para entenderlo con claridad.
$ man sed
50. Visualización de información de la versión
La opción –version de sed nos permite ver qué versión de sed está instalada en nuestra máquina. Es útil para depurar errores y reportar errores.
$ sed --version
El comando anterior mostrará la información de la versión de la utilidad sed en su sistema.
El comando sed es una de las herramientas de manipulación de texto más utilizadas por las distribuciones de Linux. Es una de las tres principales utilidades de filtrado en Unix, junto con grep y awk. Hemos esbozado 50 ejemplos simples pero útiles para ayudar a los lectores a comenzar con esta increíble herramienta.
Recomendamos encarecidamente a los usuarios que prueben estos comandos ellos mismos para obtener información práctica. Además, intente ajustar los ejemplos dados en esta guía y examine su efecto. Te ayudará a dominar sed rápidamente. Con suerte, has aprendido los conceptos básicos de sed claramente. No olvides comentar si tienes alguna pregunta.