logo

Comando Sed en Linux/Unix con ejemplos

El comando 'sed' de Linux significa editor de secuencias. Se utiliza para editar secuencias (archivos) utilizando expresiones regulares. Pero esta edición no es permanente. Solo permanece en visualización, pero en realidad el contenido del archivo sigue siendo el mismo.

Principalmente, se utiliza para la sustitución de texto; Además, se puede utilizar para otras operaciones de manipulación de texto como insertar, eliminar, buscar y más. El comando sed nos permite editar archivos sin abrirlos. La compatibilidad con expresiones regulares la convierte en una herramienta de manipulación de texto más poderosa.

Descripción general del comando sed

Es una utilidad Unix que transforma y analiza texto con un lenguaje de programación compacto y sencillo. Fue integrado entre 1973 y 1974 por Lee E. McMahon de Bell Labs y hoy está presente en casi todos los sistemas operativos. El comando sed se basó en los aspectos de secuencias de comandos del anterior qed (editor rápido) y el editor interactivo ed. Fue la primera herramienta para admitir expresiones regulares y permanece activa para el procesamiento de texto, sobre todo con el comando de sustitución. Herramientas alternativas famosas incluyen Perl y AWK para 'edición de secuencia' y manipulación de cadenas de texto plano.

Modo de operación del comando sed

El comando sed es una utilidad de procesamiento de texto orientada a líneas: lee línea por línea el texto de un archivo o flujo de entrada en un búfer interno conocido como espacio de patrón. Todas las lecturas de línea comienzan un ciclo. El comando sed utiliza una o varias operaciones que han sido descritas mediante un script sed en el espacio del patrón. Opera un lenguaje de programación que utiliza alrededor de 25 comandos que describen las operaciones sobre el texto.

Para todas las líneas de entrada, el comando sed normalmente genera el espacio del patrón y comienza el ciclo con la siguiente línea nuevamente después de ejecutar el script. Otras naturalezas de fin de guión están disponibles en los comandos del guión y en las opciones de configuración, por ejemplo, N para incluir inmediatamente la siguiente línea en el espacio del patrón, q para salir, d para eliminar el espacio del patrón, etc. Por lo tanto, un script sed se relaciona con un cuerpo de bucle que se itera desde una línea optimizada, en el que sed mantiene la variable del bucle y el bucle en sí de forma implícita.

  • Un script sed puede describirse en la línea de comando o leerse a través de un archivo aislado. En el script sed, los comandos pueden tomar una dirección adicional en el contexto de expresiones regulares o números de línea. La dirección decide cuándo se ejecuta el comando. Por ejemplo, 2d solo ejecutará el comando d (o eliminar) en la segunda línea de entrada, mientras que /^ /d eliminará todas las líneas que comiencen con un espacio.
  • Algunos comandos sed pueden utilizar el espacio de retención, un búfer especial aislado, para almacenar un texto acumulado entre ciclos. El lenguaje de comando de sed tiene solo dos variables (espacio de patrón y espacio de retención) y una funcionalidad de ramificación similar a GOTO. Sin embargo, el lenguaje es Turing completo. Los scripts esotéricos sed están disponibles para varios juegos como tetris, ajedrez, arkanoid y sokoban.
  • El bucle principal se ejecuta para todas las líneas del flujo de entrada, verificando el script sed en todas las líneas de la entrada. Las líneas del script sed son todas un par patrón-acción, que representan qué patrón emparejar y qué acción implementar, que se puede copiar como una declaración condicional. Las acciones predeterminadas (imprimir espacio de patrón, copiar línea al espacio de patrón), los flujos de entrada y salida y las variables de trabajo (retener espacio y espacio de patrón) están implícitas; Es posible especificar programas concisos de una sola línea debido al bucle principal.

Uso del comando sed

    Comando de sustitución
    El siguiente ejemplo representa el comando más típico y el uso más típico del comando sed, es decir, sustitución. El uso fue la motivación real para el comando sed:
    sed 's/regexp/replacement/g' nombre de archivo de entrada > nombre de archivo de salidaOtros comandos de sed
    También son posibles otras formas de procesamiento sencillo con unos 25 comandos sed. Por ejemplo, a continuación se utiliza la opción d para filtrar líneas que solo incluyen espacios y el final del carácter de línea:
    sed '/^ *$/d' nombre de archivo de entrada
    El ejemplo anterior utiliza algunos de los siguientes metacaracteres de expresiones regulares:
    • El signo de intercalación (^) es el mismo que el inicio de la línea.
    • El símbolo del dólar ($) es el mismo que el de completar la línea.
    • El asterisco (*) es igual a la aparición de más o cero caracteres anteriores.
    • El símbolo más (+) es el mismo que uno o varios caracteres anteriores.
    • El signo de interrogación (?) es el mismo que el carácter anterior que aparece con más o cero.
    • El símbolo de punto (.) es exactamente igual a un carácter.
    sed como filtro
    A menudo, el comando sed se utiliza como filtro dentro de una canalización en Unix:
    $generarDatos | sed 's/x/y/g'
    El programa generateData genera datos y el comando sed realiza un pequeño cambio sustituyendo x en lugar de y.Scripts sed basados ​​en archivos
    A menudo, resulta útil colocar muchos comandos sed, un solo comando por cada línea, dentro de un archivo de script y usar el indicador -f para ejecutar los comandos del archivo:
    sed -f subst.sed nombre de archivo de entrada > nombre de archivo de salida

Sintaxis:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Opciones:

Las siguientes son algunas opciones de línea de comando del comando sed:

-n, --tranquilo, --silencioso: Nos permite imprimir con fuerza el espacio del patrón.

-e guión, --expresión=guión: Se utiliza para agregar el script a los comandos a ejecutar.

-f archivo-script, --file=archivo-script: Se utiliza para agregar el contenido del archivo de script a los comandos que se ejecutarán.

--seguir enlaces simbólicos: se utiliza para seguir enlaces simbólicos cuando se procesa en el lugar.

-i[SUFIJO], --in-place[=SUFIJO]: se utiliza para editar archivos en el lugar (crea una copia de seguridad si se proporciona la opción SUFFIX).

reemplazar de cadena en java

-l N, --longitud-línea=N: Se utiliza para especificar la longitud de ajuste de línea deseada para el comando `l'.

--posix: se utiliza para deshabilitar todas las extensiones GNU.

-E, -r, --regexp-extendido: Nos permite usar las expresiones regulares extendidas en el script (para portabilidad use POSIX -E).

-s, --separado: se utiliza para considerar archivos como separados en lugar de uno solo y continúa el flujo largo.

--salvadera: Se utiliza para operar en modo sandbox.

-u, --sin búfer: Se utiliza para cargar cantidades mínimas de datos de los archivos de entrada y vacía los buffers de salida con más frecuencia.

-z, --datos-nulos: Se utiliza para separar líneas mediante caracteres NUL.

--ayuda: se utiliza para mostrar el manual de ayuda.

--versión: Se utiliza para mostrar información de la versión.

Ejemplos de comando sed

Veamos los siguientes ejemplos:

unix vs ventanas

Aplicar al directorio STDIN

El comando sed no se limita sólo a manipular archivos; Además, podemos aplicarlo al directorio STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Los comandos anteriores reemplazarán el primer texto con el segundo patrón de texto. Considere el siguiente resultado:

Filtro SED de Linux

Del resultado anterior, primero, ejecutamos el comando 'sed' en una cadena 'class7' donde 'clase' se cambia a 'jtp' y 7 a 10. Luego ejecutamos el comando 'sed' en una secuencia 'msg.txt ' donde 'aprender' se convierte en 'estudiar'.

Reemplazo global

En el ejemplo anterior, todas las palabras de 'aprendizaje' no se editaron en 'estudio'. Para editar cada palabra, tenemos que usar una 'g' de reemplazo global. Editará todas las palabras especificadas en un archivo o cadena.

Sintaxis:

 command | sed 's///g' 

Considere los siguientes ejemplos:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Los comandos anteriores reemplazarán todo el patrón de texto especificado. Considere el siguiente resultado:

Filtro SED de Linux

Del resultado anterior, ejecutando el comando 'echo class7 class9 | sed 's/class/jtp/g'' toda la 'clase' se convierte en 'jtp' y con el comando 'cat msg.txt | sed 's/learn/study/g'' todo el 'aprender' se convirtió en 'estudiar'.

Eliminar una línea

La opción 'd' nos permitirá eliminar una línea completa de un archivo. Sólo necesitamos especificar una palabra de esa línea con la opción 'd' y esa línea se eliminará. Pero tenga en cuenta que se eliminarán todas las líneas que contengan la misma palabra. Se ejecutará como:

 cat | sed '//d' 

Considere el siguiente comando:

 cat msg.txt | sed '/jtp/d' 

El comando anterior eliminará las líneas que tengan la palabra 'jtp'. Considere el siguiente resultado:

Filtro SED de Linux

Del resultado anterior, ejecutando el comando 'cat msg.txt | sed '/jtp/d'' se eliminan todas las líneas que contienen la palabra 'jtp'.

Usando el comando sed múltiple

La opción '-e' nos permite ejecutar múltiples comandos sed a la vez. Podemos realizar más de una operación sed ejecutando el comando como:

 sed -e ' ; ' 

Considere el siguiente comando:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

El comando anterior aplicará todas las operaciones especificadas en el archivo 'exm.txt'. Considere el siguiente resultado:

Filtro SED de Linux

Como podemos ver en el resultado anterior, todas las palabras 'rojas' se reemplazan por 'azul' y todas las palabras 'amarillas' se reemplazan por 'negro'. También podemos separar comandos como este:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

El resultado será el mismo que el comando anterior.

Leer comandos de un archivo

Podemos guardar los comandos sed en un archivo y aplicarlos a la vez en cualquier archivo. Se puede hacer especificando la opción '-f' de la siguiente manera:

 sed -f 

Del comando anterior, '' es un archivo que tiene una lista de comandos sed. Considere el siguiente comando:

 sed -f SedCommands exm.txt 

El comando anterior aplicará todos los comandos especificados en el archivo 'SedCommand' en 'exm.txt'. Considere el siguiente resultado:

Filtro SED de Linux

Del resultado anterior, hemos utilizado comandos aplicados al ejemplo anterior. Entonces, el resultado es el mismo que el del ejemplo anterior.

Ups conceptos

Reemplazo de personajes

Podemos utilizar el signo de exclamación (!) como delimitador de cadena. Por ejemplo, queremos reemplazar bash shell y reemplazarlo con csh shell en '/etc/passwd'. Para hacerlo, ejecute el siguiente comando:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Podemos lograr el mismo resultado ejecutando el siguiente comando:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Limitando el sed

El uso básico del comando sed procesa todo el archivo. Pero podemos limitar el comando sed y especificar cualquier línea. Hay dos formas de limitar el comando sed:

  • Una gama de líneas.
  • Un patrón que coincide con una línea específica.

Podemos proporcionar un número para especificar una línea de la siguiente manera:

 sed '3s/Red/Blue/' exm.txt 

El comando anterior aplicará la operación especificada en la tercera línea. Considere el siguiente resultado:

Filtro SED de Linux

Del resultado anterior, solo se modifica la línea tres.

También podemos especificar un rango de líneas. Para especificar un rango de líneas, ejecute el comando de la siguiente manera:

 sed '1,3s/Red/Blue/' exm.txt 

El comando anterior actualizará el texto especificado en las líneas 1 y 3. Considere el siguiente resultado:

Filtro SED de Linux

Insertar y agregar texto

Los indicadores 'i' y 'a' se utilizan para insertar y agregar texto en un archivo. La bandera 'i' agregará el texto antes de la cadena, y la bandera 'a' se usa para agregar texto después de la cadena. Considere el siguiente comando:

 echo 'Another Demo' | sed 'iFirst Demo' 

El comando anterior insertará el texto antes del texto 'Otra demostración'. Considere el siguiente resultado:

Filtro SED de Linux

Para agregar texto, ejecute el comando de la siguiente manera:

 echo 'Another Demo' | sed 'aFirst Demo' 

El comando anterior agregará el texto. Considere el siguiente resultado:

Filtro SED de Linux

Modificar líneas

La bandera 'c' se utiliza para modificar una línea específica. Para modificar una línea, ejecute el comando de la siguiente manera:

 sed '3cThis is a modified line.' exm.txt 

El comando anterior actualizará la línea tres. Considere el siguiente resultado:

marca de agua en word
Filtro SED de Linux

También podemos usar una expresión regular para actualizar más de una línea que tenga el mismo patrón. Considere el siguiente comando:

 sed '/Apple is /c Line updated.' exm.txt 

El comando anterior actualizará todas las líneas que tengan la cadena 'Apple es'. Considere el siguiente resultado:

Filtro SED de Linux

Transformación de personajes

La bandera 'y' se utiliza para transformar los caracteres. La transformación de personajes no puede limitarse a sucesos específicos. Para transformar caracteres, ejecute el comando de la siguiente manera:

 sed 'y/abc/def/' exm.txt 

El comando anterior transformará los caracteres 'a', 'b', 'c' en 'd', 'e', ​​'f'. considere el siguiente resultado:

Filtro SED de Linux

Imprimir los números de línea

El signo '=' se utiliza para imprimir el número de línea. Para imprimir el número de línea, ejecute el comando de la siguiente manera:

 sed '=' exm.txt 

El comando anterior mostrará el número de línea del contenido del archivo. Considere el siguiente resultado:

Filtro SED de Linux

El signo igual con la opción '-n' especifica el número de línea que contiene un script coincidente. Considere el siguiente resultado:

 sed -n '/mango/=' exm.txt 

El comando anterior mostrará el número de línea que contiene la palabra 'mango'. Considere el siguiente resultado:

Filtro SED de Linux

En el resultado anterior, podemos ver que la línea número 2 tiene la palabra 'mango'.