sed ("editor de flujo") es una utilidad de Unix que analiza y transforma texto, utilizando un lenguaje de programación simple y compacto. sed fue desarrollado de 1973 a 1974 por Lee E. McMahon de Bell Labs , [1] y está disponible hoy para la mayoría de los sistemas operativos. [2] sed se basó en las funciones de programación del editor interactivo ed ("editor", 1971) y el anterior qed ("editor rápido", 1965-1966). sed fue una de las primeras herramientas para 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 cadenas de texto sin formato y la "edición de secuencias" se incluyenAWK y Perl .
Paradigma | guion |
---|---|
Diseñada por | Lee E. McMahon |
Apareció por primera vez | 1974 |
Lenguaje de implementación | C |
Sitio web | www |
Influenciado por | |
ed | |
Influenciado | |
Chomski, Perl , AWK |
Historia
[3] sed, que apareció por primera vez en la versión 7 de Unix , es uno de los primeros comandos de Unix creado para el procesamiento de archivos de datos en la línea de comandos. Evolucionó como el sucesor natural del popular comando grep . [4] La motivación original era un análogo de grep (g / re / p) para sustitución, de ahí "g / re / s". [3] Previendo que también surgirían más programas de propósito especial para cada comando, como g / re / d, McMahon escribió un editor de flujo orientado a líneas 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 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 expresión regular ha influido en otros lenguajes , en particular ECMAScript y Perl . Más tarde, se desarrolló el lenguaje AWK más poderoso , y estos funcionaron como primos, lo que permitió que los scripts de shell realizaran un poderoso procesamiento de texto . sed y AWK se citan a menudo como progenitores 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./
s///
GNU sed agregó varias características nuevas, incluida la edición in situ de archivos. Super-sed es una versión extendida de sed que incluye expresiones regulares compatibles con Perl . Otra variante de sed está minizada , originalmente diseñada a partir de 4.1BSD sed por Eric S. Raymond y actualmente mantenida por René Rebe . minised fue utilizado por el Proyecto GNU hasta que el Proyecto GNU escribió una nueva versión de sed basada en la nueva biblioteca de expresiones regulares GNU. El minised actual contiene algunas extensiones para BSD sed, pero no es tan rico en funciones como GNU sed. Su ventaja es que es muy rápido y usa poca memoria. [ cita requerida ] Se utiliza en sistemas integrados y es la versión de sed proporcionada con Minix . [ cita requerida ]
Modo de operación
sed es una utilidad de procesamiento de texto orientada a líneas: lee texto, línea por línea, desde un flujo de entrada o archivo, en un búfer interno llamado espacio de patrón . Cada línea leída inicia un ciclo . Al espacio de patrones, sed aplica una o más operaciones que se han especificado mediante un script sed . sed implementa un lenguaje de programación con alrededor de 25 comandos que especifican las operaciones en el texto. Para cada línea de entrada, después de ejecutar el script, sed normalmente genera el espacio del patrón (la línea modificada por el script) y comienza el ciclo nuevamente con la siguiente línea. Otros comportamientos de fin de secuencia de comandos están disponibles a través de opciones sed y comandos de secuencia de comandos, por ejemplo, d
para eliminar el espacio del patrón, q
salir, N
agregar la siguiente línea al espacio del patrón inmediatamente, etc. Por lo tanto, un script sed corresponde al cuerpo de un bucle que itera a través de las líneas de una secuencia, donde el bucle en sí y la variable del bucle (el número de línea actual) están implícitos y son mantenidos por sed.
El script sed puede especificarse en la línea de comando ( -e
opción) o leerse desde un archivo separado ( -f
opción). Los comandos en el script sed pueden tomar una dirección opcional , en términos de números de línea o expresiones regulares . La dirección determina cuándo se ejecuta el comando. Por ejemplo, 2d
solo ejecutaría el d
comando (eliminar) en la segunda línea de entrada (imprimiendo todas las líneas menos la segunda), mientras /^ /d
que 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 sed para retener y acumular texto entre ciclos. el lenguaje de comandos de sed tiene solo dos variables (el "espacio de retención" y el "espacio de patrón") y una funcionalidad de ramificación similar a GOTO ; sin embargo, el lenguaje es Turing-completo , [5] [6] y existen scripts sed esotéricos para juegos como sokoban , arkanoid , [7] ajedrez , [8] y tetris . [9]
Se ejecuta un bucle principal para cada línea del flujo de entrada, evaluando el script sed en cada línea de la entrada. Las líneas de un script sed son cada una un par de patrón-acción, lo que indica qué patrón coincidir y qué acción realizar, que puede reformularse como una declaración condicional . Debido a que el bucle principal, las variables de trabajo (espacio de patrón y espacio de retención), los flujos de entrada y salida y las acciones predeterminadas (copiar línea en espacio de patrón, imprimir espacio de patrón) están implícitos, es posible escribir programas concisos de una sola línea . Por ejemplo, el programa sed dado por:
10q
imprimirá las primeras 10 líneas de entrada y luego se detendrá.
Uso
Comando de sustitución
El siguiente ejemplo muestra un uso típico y más común de sed: sustitución. Este uso fue de hecho la motivación original para sed: [4]
sed 's / regexp / replacement / g' inputFileName> outputFileName
En algunas versiones de sed, la expresión debe ir precedida de -e
para indicar que sigue una expresión. El s
significa sustituto, mientras que el g
significa global, lo que significa que todas las apariciones coincidentes en la línea serían reemplazadas. La expresión regular (es decir, el patrón) que se va a buscar se coloca después del primer símbolo delimitador (barra aquí) y el reemplazo sigue al segundo símbolo. La barra inclinada ( /
) es el símbolo convencional, que se origina en el carácter de "búsqueda" en ed, pero cualquier otro podría usarse para hacer la sintaxis más legible si no aparece en el patrón o reemplazo; esto es útil para evitar el " síndrome del palillo inclinado ".
El comando de sustitución, que se origina en buscar y reemplazar en ed, implementa el análisis y la creación de plantillas simples . El regexp
proporciona tanto la coincidencia de patrones y el texto de ahorro a través de sub-expresiones, mientras que el replacement
puede ser texto literal, o una cadena de formato que contiene los caracteres &
para "toda partido" o los especiales secuencias de escape \1
a través \9
de la n º salvó sub-expresión. Por ejemplo, sed -r "s/(cat|dog)s?/\1s/g"
reemplaza todas las apariciones de "gato" o "perro" con "gatos" o "perros", sin duplicar una "s" existente: (cat|dog)
es la primera (y única) subexpresión guardada en la expresión regular y \1
en el formato string sustituye esto en la salida.
Otros comandos sed
Además de la sustitución, son posibles otras formas de procesamiento simple, utilizando unos 25 comandos sed. Por ejemplo, lo siguiente usa el comando d para eliminar líneas que están en blanco o solo contienen espacios:
sed '/ ^ * $ / d' inputFileName
Este ejemplo utiliza algunos de los siguientes metacaracteres de expresiones regulares (sed admite la gama completa de expresiones regulares):
- El signo de intercalación (
^
) coincide con el comienzo de la línea. - El signo de dólar (
$
) coincide con el final de la línea. - El asterisco (
*
) coincide con cero o más ocurrencias del carácter anterior. - El signo más (
+
) coincide con una o más ocurrencias del carácter anterior. - El signo de interrogación (
?
) coincide con cero o una aparición del carácter anterior. - El punto (
.
) coincide exactamente con un carácter.
Son posibles construcciones sed complejas, lo que le permite servir como un lenguaje de programación simple, pero altamente especializado . El flujo de control, por ejemplo, se puede administrar mediante el uso de una etiqueta (dos puntos seguidos de una cadena) y la instrucción de bifurcación b
. Una instrucción b
seguida de un nombre de etiqueta válido moverá el procesamiento al bloque que sigue a esa etiqueta.
sed usado como filtro
En Unix, sed se usa a menudo como un filtro en una tubería :
generateData | sed 's / x / y / g'
Es decir, un programa como "generateData" genera datos y luego sed hace el pequeño cambio de reemplazar x por y . Por ejemplo:
$ echo xyz xyz | sed 's / x / y / g' yyz yyz
[notas 1]
Scripts sed basados en archivos
A menudo es útil poner varios comandos sed, un comando por línea, en un archivo de script como subst.sed
, y luego usar la -f
opción para ejecutar los comandos (como s/x/y/g
) desde el archivo:
sed -f subst.sed inputFileName> outputFileName
Se puede colocar cualquier número de comandos en el archivo de secuencia de comandos, y el uso de un archivo de secuencia de comandos también evita problemas con el escape o las sustituciones del shell.
Dicho archivo de secuencia de comandos puede hacerse directamente ejecutable desde la línea de comando anteponiéndolo con una " línea shebang " que contenga el comando sed y asignando el permiso ejecutable al archivo. Por ejemplo, subst.sed
se puede crear un archivo con contenido:
#! / bin / sed -fs / x / y / g
El usuario actual puede convertir el archivo en ejecutable con el chmod
comando:
chmod u + x subst.sed
Luego, el archivo se puede ejecutar directamente desde la línea de comando:
subst.sed inputFileName> outputFileName
Edición in situ
La -i
opción, introducida en GNU sed, permite la edición in situ de archivos (en realidad, se crea un archivo de salida temporal en segundo plano y luego el archivo original se reemplaza por el archivo temporal). Por ejemplo:
sed -i 's / abc / def /' nombrearchivo
Ejemplos de
¡Hola Mundo! ejemplo
# convertir el flujo de texto de entrada a "¡Hola, mundo!"s /.*/ ¡Hola mundo! /q
Este "¡Hola, mundo!" script está en un archivo (por ejemplo, script.txt) y se invoca con sed -f script.txt inputFileName
, donde "inputFileName" es el archivo de texto de entrada. El script cambia la línea # 1 de "inputFileName" a "¡Hola, mundo!" y luego se cierra, imprimiendo el resultado antes de que sed salga. Las líneas de entrada más allá de la línea # 1 no se leen ni se imprimen. Así que la única salida es "¡Hola, mundo!".
El ejemplo enfatiza muchas características clave de sed:
- Los programas sed típicos son bastante cortos y simples.
- Los scripts sed pueden tener comentarios (la línea que comienza con el
#
símbolo). - El
s
comando (sustituto) es el comando sed más importante. - sed permite una programación simple, con comandos como
q
(salir). - sed usa expresiones regulares, como
.*
(cero o más de cualquier carácter).
Otros ejemplos sencillos
A continuación, siga varios scripts sed; estos pueden ejecutarse pasándolos como un argumento a sed, o colocándolos en un archivo separado y ejecutados a través de -f
o haciendo que el script sea ejecutable.
Para reemplazar cualquier instancia de una determinada palabra en un archivo con "CENSURADO", como una contraseña de IRC, y guardar el resultado:
sed -is / yourpassword / CENSURADO / ./status.chat.log
Para eliminar cualquier línea que contenga la palabra "yourword" (la dirección es '/ yourword /'):
/ yourword / d
Para eliminar todas las instancias de la palabra "yourword":
s / yourword // g
Para eliminar dos palabras de un archivo simultáneamente:
s / primera palabra // gs / secondword // g
Para expresar el ejemplo anterior en una línea, como cuando se ingresa en la línea de comando, se pueden unir dos comandos mediante el punto y coma:
sed "s / firstword // g; s / secondword // g" inputFileName
Ejemplo de procesamiento multilínea
En el siguiente ejemplo, sed, que generalmente solo funciona en una línea, elimina las nuevas líneas de las oraciones donde la segunda línea comienza con un espacio. Considere el siguiente texto:
Este es mi perro, cuyo nombre es Frank.Este es mi pezcuyo nombre es George.Esta es mi cabra cuyo nombre es Adán.
El script sed a continuación convertirá el texto de arriba en el siguiente texto. Tenga en cuenta que el script afecta solo a las líneas de entrada que comienzan con un espacio:
Este es mi perro, cuyo nombre es Frank.Este es mi pezcuyo nombre es George.Esta es mi cabra, cuyo nombre es Adán.
El guión es:
nortes / \ n / /PAGD
Esto se explica como:
- (
N
) agregue la siguiente línea al espacio del patrón; - (
s/\n / /
) busque una nueva línea seguida de un espacio, reemplácela con un espacio; - (
P
) imprima la línea superior del espacio del patrón; - (
D
) elimine la línea superior del espacio del patrón y ejecute el script nuevamente.
Esto se puede expresar en una sola línea mediante punto y coma:
sed 'N; s / \ n / /; PAG; D 'inputFileName
Limitaciones y alternativas
Aunque simple y limitado, sed es lo suficientemente poderoso para una gran cantidad de propósitos. Para un procesamiento más sofisticado, en su lugar se utilizan lenguajes más potentes como AWK o Perl . Estos se usan particularmente si se transforma una línea de una manera más complicada que la extracción de expresiones regulares y el reemplazo de plantillas, aunque en principio son posibles transformaciones arbitrariamente complicadas usando el búfer de retención.
Por el contrario, para operaciones más simples, utilidades especializadas de Unix como grep (imprimir líneas que coinciden con un patrón), head (imprimir la primera parte de un archivo), tail (imprimir la última parte de un archivo) y tr (traducir o eliminar caracteres) a menudo son preferibles. Para las tareas específicas para las que están diseñadas, estas utilidades especializadas suelen ser más simples, claras y rápidas que una solución más general como sed.
Los comandos y la sintaxis ed / sed continúan usándose en programas descendientes, como los editores de texto vi y vim . Un análogo a ed / sed es sam / ssam, donde sam es el editor de Plan 9 , y ssam es una interfaz de flujo para él, lo que produce una funcionalidad similar a sed.
Ver también
- Lista de comandos de Unix
- AWK
- tr (Unix)
Notas
- ^ En el uso de la línea de comandos, las comillas alrededor de la expresión no son necesarias y solo son necesarias si el shell no interpretaría la expresión como una sola palabra (token). Para el script
s/x/y/g
no hay ambigüedad, por lo quegenerateData | sed s/x/y/g
funciona correctamente. Sin embargo, las citas generalmente se incluyen para mayor claridad y, a menudo, son necesarias, especialmente para espacios en blanco (p's/x x/y y/'
.Ej.,). La mayoría de las veces se utilizan comillas simples para evitar que el shell se interprete$
como una variable de shell. Se utilizan comillas dobles, por ejemplo"s/$1/$2/g"
, para permitir que el shell sustituya a un argumento de línea de comando u otra variable de shell.
Referencias
- ^ "Las preguntas frecuentes de sed, sección 2.1" . Consultado el 21 de mayo de 2013 .
- ^ "Las preguntas frecuentes de sed, sección 2.2" . Consultado el 21 de mayo de 2013 .
- ^ a b McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ^ a b c d "Sobre la historia temprana y el impacto de Unix" .
Un tiempo después surgió la demanda de otro programa de propósito especial, gres, para sustitución: g / re / s. Lee McMahon se comprometió a escribirlo, y pronto previó que la familia no tendría fin: g / re / d, g / re / a, etc. A medida que su concepto se desarrolló, se convirtió en sed…
- ^ "Implementación de una máquina de Turing como Sed Script" .
- ^ "Turing.sed" .
- ^ "El $ SED Home - gamez" .
- ^ "bolknote / SedChess" . GitHub .
- ^ "Sedtris, un juego de Tetris escrito para sed" .
Otras lecturas
- Octava edición de Bell Lab (circa 1985) Unix sed (1) página de manual
- Documentación de GNU sed o la página del manual
- Dale Dougherty y Arnold Robbins (marzo de 1997). sed & awk (2ª ed.). O'Reilly . ISBN 1-56592-225-5.
- Arnold Robbins (junio de 2002). sed y awk Pocket Reference (2ª ed.). O'Reilly . ISBN 0-596-00352-8.
- Peter Patsis (diciembre de 1998). Libro de trabajo interactivo del programador de UNIX AWK y SED (Libro de trabajo interactivo de UNIX) . Prentice Hall . ISBN 0-13-082675-8.
- Daniel Goldman (febrero de 2013). Guía definitiva de sed . Prensa EHDP. ISBN 978-1-939824-00-4.
- Sourceforge.net , las preguntas frecuentes de sed (marzo de 2003)
enlaces externos
- - Referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group
- - Manual del programador de Plan 9 , Volumen 1
Tutoriales
- Sed - Introducción y tutorial , por Bruce Barnett
- SED - Un editor de texto no interactivo (1974) , por Lee E. McMahon
- Más de 31 ejemplos para el comando Sed Linux en la manipulación de texto , por Mokhtar Ebrahim
Ejemplos de
- Principales fuentes de scripts sed, archivos, uso
- SED y Shell Scripts de Roger Chang (2012)
- Comandos 'sed' principales: ejemplos de uso
- Ejemplos de comandos sed en Unix y Linux
Otros enlaces
- Página de inicio de GNU sed (incluye manual de GNU sed)
- sed the Stream Editor (2004) (Eric Pement)
- sed-users grupo de discusión de Yahoo