El comando Sed o Stream Editor es una utilidad muy potente que ofrecen los sistemas Linux/Unix. Se utiliza principalmente para la sustitución de texto , encontrar & reemplazar pero también puede realizar otras manipulaciones de texto como inserción, eliminación, búsqueda, etc. Con SED, podemos editar archivos completos sin tener que abrirlos. Sed también soporta el uso de expresiones regulares, lo que hace de sed una herramienta de manipulación de pruebas aún más potente.
En este artículo, aprenderemos a utilizar el comando SED con la ayuda de algunos ejemplos. La sintaxis básica para usar el comando sed es,
sed OPTIONS…
Ahora veamos algunos ejemplos.
Ejemplo :1) Visualización de texto parcial de un archivo
Con sed, podemos ver sólo una parte de un archivo en lugar de ver todo el archivo. Para ver algunas líneas del archivo, utilice el siguiente comando,
$ sed -n 22,29p testfile.txt
aquí, la opción ‘n’ suprime la impresión de todo el archivo & la opción ‘p’ imprimirá sólo las líneas del 22 al 29.
Ejemplo :2) Mostrar todo excepto algunas líneas
Para mostrar todo el contenido de un archivo excepto alguna parte, utilice el siguiente comando,
$ sed 22,29d testfile.txt
La opción ‘d’ eliminará las líneas mencionadas de la salida.
Ejemplo :3) Mostrar cada 3ª línea a partir de la línea N
Para mostrar el contenido de cada 3ª línea a partir de la línea número 2 o cualquier otra línea, utilice el siguiente comando
$ sed -n '2~3p' file.txt
Ejemplo :4 ) Borrar una línea con el comando sed
Para borrar una línea con sed de un archivo, utilice el siguiente comando,
$ sed Nd testfile.txt
Donde ‘N’ es el número de línea & la opción ‘d’ borrará el número de línea mencionado. Para borrar la última línea del archivo, utilice
$ sed $d testfile.txt
Ejemplo :5) Borrar un rango de líneas
Para borrar un rango de líneas del archivo, ejecute
$ sed '29,34d' testfile.txt
Esto borrará las líneas 29 a 34 del archivo testfile.txt.
Ejemplo :6) Eliminación de líneas distintas a las mencionadas
Para eliminar líneas distintas a las mencionadas de un archivo, utilizaremos ‘!’
$ sed '29,34!d' testfile.txt
Aquí se utiliza la opción ‘!’ como no, por lo que invertirá la condición es decir, no eliminará las líneas mencionadas. Todas las líneas que no sean la 29-34 se borrarán de los archivos testfile.txt.
Ejemplo :7) Añadir líneas/espacios en blanco
Para añadir una línea en blanco después de cada línea no en blanco, utilizaremos la opción ‘G’,
$ sed G testfile.txt
Ejemplo :8) Buscar y reemplazar una cadena usando sed
Para buscar & reemplazar una cadena del archivo, usaremos el siguiente ejemplo,
$ sed 's/danger/safety/' testfile.txt
Aquí la opción ‘s’ buscará la palabra ‘peligro’ & reemplazándola por ‘seguridad’ en cada línea sólo para la primera ocurrencia.
Ejemplo :9) Buscar y reemplazar una cadena de todo el archivo usando sed
Para reemplazar la palabra completamente del archivo, usaremos la opción ‘g’ con ‘s’,
$ sed 's/danger/safety/g' testfile.txt
Ejemplo :10) Reemplazar la enésima ocurrencia del patrón de cadena
También podemos sustituir una cadena en la enésima ocurrencia de un archivo. Como reemplazar ‘peligro’ por ‘seguridad’ sólo en la segunda ocurrencia,
$ sed ‘s/danger/safety/2’ testfile.txt
Para reemplazar ‘peligro’ en la segunda ocurrencia de cada línea de todo el archivo, utilice
$ sed 's/danger/safety/2g' testfile.txt
Ejemplo :11) Reemplazar una cadena en una línea concreta
Para reemplazar una cadena sólo de una línea concreta, usa
$ sed '4 s/danger/safety/' testfile.txt
Esto sólo sustituirá la cadena de la 4ª línea del archivo. También podemos mencionar un rango de líneas en lugar de una sola línea,
$ sed '4,9 s/danger/safety/' testfile.txt
Ejemplo :12) Añadir una línea después/antes de la búsqueda coincidente
Para añadir una nueva línea con algún contenido después de cada coincidencia de patrón, utilice la opción ‘a’ ,
$ sed '/danger/a "This is new line with text after match"' testfile.txt
Para añadir una nueva línea con algún contenido a antes de cada coincidencia de patrón, utilice la opción ‘i’,
$ sed '/danger/i "This is new line with text before match" ' testfile.txt
Ejemplo :13) Cambiar una línea entera con el patrón coincidente
Para cambiar una línea entera a una nueva línea cuando un patrón de búsqueda coincide necesitamos usar la opción ‘c’ con sed,
$ sed '/danger/c "This will be the new line" ' testfile.txt
Así que cuando el patrón coincide con
peligro
Toda la línea será cambiada a la línea mencionada.
Opciones avanzadas con sed
Hasta ahora sólo estábamos usando expresiones simples con sed, ahora discutiremos algunos usos avanzados de sed con regex,
Ejemplo :14) Ejecutar múltiples comandos sed
Si necesitamos realizar múltiples expresiones sed, podemos utilizar la opción ‘e’ para encadenar los comandos sed,
$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt
Ejemplo :15) Hacer una copia de seguridad antes de editar un archivo
Para crear una copia de seguridad de un archivo antes de que lo editemos, utiliza la opción ‘-i.bak’,
$ sed -i.bak -e 's/danger/safety/g' testfile.txt
Esto creará una copia de seguridad del archivo con extensión .bak. También puede utilizar otra extensión si lo desea.
Ejemplo :16) Borrar una línea del archivo que comienza con & que termina con un patrón
Para borrar una línea que comienza con una cadena determinada & que termina con otra cadena, usa
$ sed -e 's/^danger.*stops$//g' testfile.txt
Esto borrará la línea con
Ejemplo :17) Añadiendo líneas
Para añadir algo de contenido antes de cada línea con sed & regex, usa
$ sed -e 's/.*/testing sed &/' testfile.txt
Así que ahora cada línea tendrá ‘testing sed’ antes de ella.
Ejemplo :18) Eliminar todas las líneas comentadas & líneas vacías
Para eliminar todas las líneas comentadas es decir líneas con # & todas las líneas vacías, utilice
$ sed -e 's/#.*//;/^$/d' testfile.txt
Para eliminar sólo las líneas comentadas, utilice
$ sed -e 's/#.*//' testfile.txt
Ejemplo :19) Obtener la lista de todos los nombres de usuario de /etc/passwd
Para obtener la lista de todos los nombres de usuario del archivo /etc/passwd, usa
$ sed 's/\(*\).*/\1/' /etc/passwd
se generará en pantalla una lista completa de todos los nombres de usuario como salida.
Ejemplo :20) Evitar la sobreescritura de enlaces del sistema con el comando sed
Se sabe que el comando ‘sed -i’ elimina los enlaces del sistema & creando sólo archivos normales en lugar del archivo de enlace. Así que para evitar tal situación & evitar que ‘sed -i’ destruya los enlaces, utilice las opciones ‘-follow-symklinks’ con el comando que se ejecuta.
Supongamos que quiero desactivar SELinux en CentOS o RHEL Severs
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux