sed (abreviatura de stream ed itor ) es una utilidad que transforma texto mediante un script escrito en un lenguaje de programación relativamente simple y compacto . Fue desarrollado entre 1973 y 1974 por Lee E. McMahon de Bell Labs , [ 1 ] y está disponible hoy en día para la mayoría de los sistemas operativos. [ 2 ] La funcionalidad de sed se basa en las características de scripting del editor interactivo ed ("editor", 1971) y del anterior qed ("quick editor", 1965-66). Fue una de las primeras herramientas en admitir expresiones regulares y sigue utilizándose para el procesamiento de texto, sobre todo con el comando de sustitución. Entre las herramientas alternativas populares para la manipulación de texto y la edición de flujos se incluyen AWK y Perl . El comando de shell que ejecuta la utilidad tiene el mismo nombre: .sed
Historia
Apareciendo por primera vez en la versión 7 de Unix , [ 3 ] sed es una de las primeras utilidades de Unix creadas para el procesamiento de archivos de datos mediante la línea de comandos. Evolucionó como el sucesor natural del popular comando grep . [ 4 ] La motivación original fue un análogo de grep (g/re/p) para la sustitución, de ahí "g/re/s". [ 3 ] Previendo que también surgirían otros programas de propósito especial para cada comando, como g/re/d, McMahon escribió un editor de flujo orientado a la línea de propósito general, que se convirtió en sed. [ 4 ] La sintaxis de sed, en particular el uso de /para la coincidencia de patrones y s///para la sustitución, se originó con ed , el precursor de sed, que era de uso común en ese momento, [ 4 ] y la sintaxis de expresiones regulares ha influido en otros lenguajes, en particular ECMAScript y Perl . Más tarde, se desarrolló el lenguaje más potente AWK , y estos funcionaron como primos, permitiendo que los scripts de shell realizaran un potente procesamiento de texto . A menudo se cita a sed y a AWK como precursores e inspiración de Perl, e influyeron en la sintaxis y la semántica de Perl, especialmente en los operadores de coincidencia y sustitución.
GNU sed añadió varias características nuevas, incluida la edición de archivos directamente . Super-sed es una versión extendida de sed que incluye expresiones regulares compatibles con Perl . Otra variante de sed es minised , originalmente obtenida mediante ingeniería inversa a partir de sed 4.1BSD por Eric S. Raymond y actualmente mantenida por René Rebe . minised fue utilizada por el Proyecto GNU hasta que este escribió una nueva versión de sed basada en la nueva biblioteca de expresiones regulares de GNU. La versión actual de minised contiene algunas extensiones a sed BSD, pero no es tan completa como sed GNU. Su ventaja es que es muy rápida y consume poca memoria. Se utiliza en sistemas embebidos y es la versión de sed que se proporciona con Minix . [ 5 ]
Tratamiento
sed lee texto, línea por línea, desde un flujo de entrada (como un archivo) en un búfer interno llamado espacio de patrones . Según lo especificado en un script, sed aplica comandos (llamados acciones en la documentación de sed) al espacio de patrones. A menos que se indique lo contrario, sed genera el espacio de patrones (la línea modificada) y comienza el ciclo nuevamente con la siguiente línea. Otros comportamientos al final del script están disponibles mediante opciones de línea de comandos y comandos de script, como dborrar el espacio de patrones, qsalir o Nagregar la siguiente línea al espacio de patrones inmediatamente. Por lo tanto, un script de sed corresponde al cuerpo de un bucle que itera a través de las líneas de un flujo, donde el bucle en sí y la variable del bucle (el número de línea actual) son implícitos y se mantienen por sed.
Debido a que la iteración sobre las líneas de entrada, las variables (espacio de patrón y espacio de retención), los flujos de entrada y salida, y las acciones predeterminadas (copiar línea al espacio de patrón, imprimir espacio de patrón) son implícitas, es posible escribir programas concisos de una sola línea . Por ejemplo, el script 10qimprime las primeras 10 líneas de entrada y luego se detiene.
Usar
Ejecución condicional
Los comandos aceptan un argumento de dirección opcional en términos como un número de línea o una expresión regular . La dirección determina cuándo se aplica el comando. Por ejemplo, 2dejecutaría el dcomando (eliminar) en la segunda línea de entrada, mientras /^ /dque eliminaría todas las líneas que comiencen con un espacio. Un búfer especial separado, el espacio de retención , puede ser utilizado por algunos comandos para retener y acumular texto entre ciclos. El lenguaje proporciona solo dos variables (el "espacio de retención" y el "espacio de patrón") y funcionalidad de ramificación tipo GOTO ; sin embargo, el lenguaje es Turing-completo , [ 6 ] [ 7 ] y existen scripts sed esotéricos para juegos como sokoban , arkanoid , [ 8 ] ajedrez , [ 9 ] y tetris . [ 10 ]
Pareo
sed admite la sintaxis de expresiones regulares para hacer coincidir el texto de entrada con un patrón. Por ejemplo, el script '/^ *$/d'utiliza el comando d para filtrar las líneas que solo contienen espacios o solo contienen el carácter de fin de línea.
Los metacaracteres de expresiones regulares admitidos incluyen:
- circunflejo (
^) - Coincide con el inicio de la línea.
- signo de dólar (
$) - Coincide con el final de la línea.
- asterisco (
*) - Coincide con cero o más ocurrencias del carácter anterior.
- más (
+) - Coincide con una o más apariciones del carácter anterior.
- signo de interrogación (
?) - Coincide con cero o una aparición del carácter anterior.
- punto (
.) - Coincide exactamente con un carácter.
Sustitución
La motivación original para sed fue la sustitución. [ 4 ] La siguiente línea de comandos utiliza un comando de sustitución.
sed 's/regexp/replacement/g' inputFileName > outputFileName El ssímbolo representa la sustitución, y el gsímbolo representa la globalización, lo que significa que todas las coincidencias en la línea se reemplazarían. El patrón de expresión regular que se va a buscar se coloca después del primer símbolo delimitador (barra inclinada en este caso) y el reemplazo sigue al segundo símbolo. La barra inclinada ( /) es el símbolo convencional, que proviene del carácter de "búsqueda" en ed, pero se puede usar cualquier otro para que la sintaxis sea más legible si no aparece en el patrón o en el reemplazo; esto es útil para evitar el " síndrome del palillo inclinado ".
El comando de sustitución, que tiene su origen en la búsqueda y reemplazo en ed, implementa un análisis y plantillas simples . regexpProporciona tanto coincidencia de patrones como guardado de texto a través de subexpresiones, mientras que replacementpuede ser texto literal o una cadena de formato que contenga los caracteres ¶ "coincidencia completa" o las secuencias de escape\1 especiales para \9la n -ésima subexpresión guardada. Por ejemplo, sed -r "s/(cat|dog)s?/\1s/g"reemplaza todas las ocurrencias de "cat" o "dog" con "cats" o "dogs", sin duplicar una "s" existente: (cat|dog)es la primera (y única) subexpresión guardada en la expresión regular, y \1en la cadena de formato la sustituye en la salida.
Flujo de control
El flujo de control se puede gestionar mediante una etiqueta (dos puntos seguidos de una cadena de texto) y la instrucción de bifurcación bo bifurcación condicional . El comando transfiere el control al comando que sigue a la etiqueta ":FOO". Esta instrucción solo se ejecuta si se ha producido una sustitución exitosa desde la anterior (o desde el inicio del programa, en el caso de la primera encontrada).tb FOOttt
La {instrucción inicia un bloque de comandos hasta la dirección correspondiente }. En la mayoría de los casos, el bloque está condicionado por un patrón de direcciones.
Como filtro
sed se usa a menudo como filtro en una tubería . En la siguiente línea de comandos, el echocomando escribe "xyz" en la salida estándar, que se envía a sed, el cual reemplaza "x" por "y", como se muestra en la segunda línea.
$ echo xyz | sed 's/x/y/g' yyzGuion
El script se puede especificar en la línea de comandos ( -eopción) o leer desde un archivo ( -fopción).
En la línea de comandos, las comillas alrededor de la expresión solo son necesarias si el intérprete de comandos no la interpretaría como un solo token. Sin embargo, las comillas se suelen incluir para mayor claridad y a menudo son necesarias, especialmente para los espacios en blanco (por ejemplo, ). Generalmente se usan comillas simples para evitar que el intérprete de comandos la interprete como una variable de shell. Se usan comillas dobles, como , para permitir que el intérprete de comandos sustituya un argumento de línea de comandos u otra variable de shell.'s/x x/y y/'$"s/$1/$2/g"
Un script se puede almacenar como un archivo; un comando por línea. Usar un archivo de script evita problemas con el escape y la sustitución de caracteres del shell. La siguiente línea de comandos utiliza la -fopción para seleccionar el uso de comandos desde el archivo subst.sed.
sed -f subst.sed nombreArchivoEntrada > nombreArchivoSalida Un archivo de script puede hacerse ejecutable directamente desde la línea de comandos incluyendo un prefijo shebang seguido de comandos. Por ejemplo:
#!/bin/sed -f s / x / y / gEl archivo (subst.sed) puede hacerse ejecutable mediante un comando como:
chmod +x subst.sed El archivo se puede ejecutar desde la línea de comandos de la siguiente manera:
sustituyó inputFileName > outputFileName Edición en contexto
La opción in situ ( -i), introducida en GNU sed, permite modificar el archivo de entrada. Se crea un archivo de salida temporal y luego el archivo original se reemplaza con el archivo temporal.
Ejemplos
Para reemplazar cada aparición de "tucontraseña" en un archivo con "REDACTED":
s / tu contraseña / REDACTADO / gPara eliminar cualquier línea que contenga la palabra "tupalabra":
/ tu palabra / dPara eliminar todas las instancias de la palabra "tupalabra":
s / tu palabra // gPara eliminar dos palabras de un archivo:
s / primera palabra // g s / segunda palabra // gPara expresar el ejemplo anterior en una sola línea, como cuando se introduce en la línea de comandos, se pueden unir dos comandos mediante el punto y coma:
s / primera palabra // g ; s / segunda palabra // gEl script elimina los saltos de línea de las oraciones donde la segunda línea comienza con un espacio. Esto demuestra la fusión de líneas, lo cual es notable ya que sed generalmente opera en cada línea de forma aislada. Se puede explicar de la siguiente manera:N;s/\n //;P;D
- (
N) agregue la siguiente línea al espacio de patrones; - (
s/\n / /) encuentra una nueva línea seguida de un espacio, reemplázala con un espacio; - (
P) imprime la línea superior del espacio de patrones; - (
D) elimine la primera línea del espacio de patrones y ejecute el script nuevamente.
Para introducir texto:
Este es mi perro, cuyo nombre es Frank. Este es mi pez, cuyo nombre es George. Esta es mi cabra, cuyo nombre es Adán.
El resultado es:
Este es mi perro, que se llama Frank. Este es mi pez, cuyo nombre es George. Esta es mi cabra, que se llama Adán.
Limitaciones y alternativas
Aunque sencillo y limitado, sed es suficientemente potente para una gran variedad de propósitos. Para un procesamiento más sofisticado, se utilizan lenguajes más potentes como AWK o Perl . Estos se emplean especialmente para transformar una línea de una manera más compleja que la simple extracción de expresiones regulares y la sustitución de plantillas, si bien, en principio, es posible realizar transformaciones arbitrariamente complejas utilizando el búfer de retención.
Por el contrario, para operaciones más sencillas, suelen preferirse utilidades especializadas de Unix como grep (para imprimir las líneas que coinciden con un patrón), head (para imprimir la primera parte de un archivo), tail (para imprimir la última parte de un archivo) y tr (para traducir o eliminar caracteres). Para las tareas específicas para las que están diseñadas, estas utilidades especializadas suelen ser más sencillas, claras y rápidas que una solución más general como sed.
Los comandos y la sintaxis de ed/sed se siguen utilizando en programas derivados, como los editores de texto vi y vim . Un ejemplo análogo a ed/sed es sam /ssam, donde sam es el editor de Plan 9 y ssam es una interfaz de flujo para este, que ofrece una funcionalidad similar a la de sed.
Véase también
- Lista de comandos POSIX
- El pozo de alquitrán de Turing : un lenguaje de programación intencionalmente oscuro.
Referencias
- ↑ "Preguntas frecuentes sobre sed, Sección 2.1" . Archivado del original el 27 de junio de 2018. Consultado el 21 de mayo de 2013 .
- ↑ "Preguntas frecuentes sobre sed, Sección 2.2" . Archivado del original el 27 de junio de 2018. Consultado el 21 de mayo de 2013 .
- 1 2 McIlroy, MD (1987). Un lector de Research Unix: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- 1 2 3 4 "Sobre la historia temprana y el impacto de Unix" . Archivado del original el 7 de septiembre de 2017. Recuperado el 7 de mayo de 2008.
Poco después surgió la necesidad de otro programa de propósito especial, gres, para la sustitución: g/re/s. Lee McMahon se encargó de escribirlo y pronto previó que la familia no tendría fin: g/re/d, g/re/a, etc. A medida que su concepto se desarrollaba, se convirtió en...
- ↑ Raymond, Eric Steven ; Rebe, René (2017-03-03). "tar-mirror/minised: Una implementación SED más pequeña, más barata y más rápida" . GitHub . Archivado del original el 13-06-2018 . Recuperado el 20-05-2024 .
- ↑ "Implementación de una máquina de Turing como script Sed" . Archivado del original el 20 de febrero de 2018. Consultado el 24 de abril de 2003 .
- ↑ "Turing.sed" . Archivado del original el 16 de enero de 2018. Consultado el 24 de abril de 2003 .
- ↑ "The $SED Home - gamez" . Archivado del original el 5 de octubre de 2022. Consultado el 11 de agosto de 2025 .
- ↑ "bolknote/SedChess" . GitHub . Archivado del original el 2 de diciembre de 2018. Consultado el 23 de agosto de 2013 .
- ↑ "Sedtris, un juego de Tetris escrito para sed" . GitHub . Archivado del original el 2 de diciembre de 2018. Recuperado el 3 de octubre de 2016 .
Lecturas adicionales
- Página del manual de Unix sed(1) de la octava edición de Bell Labs (alrededor de 1985)
- Documentación de GNU sed o la página del manual
- Dale Dougherty y Arnold Robbins (marzo de 1997). sed y awk (2ª ed.). O'Reilly . ISBN 1-56592-225-5.
- Arnold Robbins (junio de 2002). Sed y awk: Guía de bolsillo (2.ª ed.). O'Reilly . ISBN 0-596-00352-8.
- Peter Patsis (diciembre de 1998). UNIX AWK and SED Programmer's Interactive Workbook (UNIX Interactive Workbook) . Prentice Hall . ISBN 0-13-082675-8.
- Daniel Goldman (febrero de 2013). Guía definitiva de sed . EHDP Press. ISBN 978-1-939824-00-4.
- Sourceforge.net , Preguntas frecuentes sobre sed (marzo de 2003)
Enlaces externos
- – Referencia de shell y utilidades, Especificación única de UNIX , Versión 5 de The Open Group
- – Manual del programador de Plan 9 , Volumen 1
- Sed - Introducción y tutorial , por Bruce Barnett
- "Página principal de GNU sed" .(incluye manual)
- Eric Pement (2004). "sed the Stream Editor" .
- Eric S. Raymond . "Implementación minimizada de sed" . ExactCODE .
- Software multiplataforma
- Programas estándar de Unix
- utilidades de procesamiento de texto de Unix
- Utilidades Unix SUS2008
- Órdenes del Plan 9
- Comandos de Qshell para IBM i