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
- 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.
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 salida
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:
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.
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
- Reemplazo global
- Eliminar una línea
- Usando el comando sed múltiple
- Leer comandos de un archivo
- Reemplazo de personajes
- Limitando el sed
- Insertar y agregar texto
- Modificar líneas
- Transformación de personajes
- Imprimir los números de línea
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
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:
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:
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:
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:
En el resultado anterior, podemos ver que la línea número 2 tiene la palabra 'mango'.