sed - sed

sed
Paradigma guion
Diseñada por Lee E. McMahon
Apareció por primera vez 1974 ; Hace 47 años ( 1974 )
Lenguaje de implementación C
Sitio web www .gnu .org / software / sed /
Influenciado por
ed
Influenciado
Perl , AWK

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 , y está disponible hoy para la mayoría de los sistemas operativos. 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. Las herramientas alternativas populares para la manipulación de cadenas de texto sin formato y la "edición de secuencias" incluyen AWK y Perl .

Historia

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 . La motivación original era un análogo de grep (g / re / p) para sustitución, de ahí "g / re / s". 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. La sintaxis de sed, en particular el uso de /para la coincidencia de patrones y la s///sustitución, se originó con ed , el precursor de sed, que era de uso común en ese momento, y la sintaxis de expresión regular ha influido en otros lenguajes, notablemente 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 a menudo se citan como progenitores e inspiración para Perl, e influyeron en la sintaxis y semántica de Perl, especialmente en los operadores de coincidencia y sustitución.

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. Se utiliza en sistemas integrados y es la versión de sed proporcionada con Minix .

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 archivo o flujo de entrada , 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, dpara eliminar el espacio del patrón, qsalir, Nagregar 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 de 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 ( -eopción) o leerse desde un archivo separado ( -fopció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, 2dsolo ejecutaría el dcomando (eliminar) en la segunda línea de entrada (imprimiendo todas las líneas menos la segunda), 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 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 y existen scripts sed esotéricos para juegos como sokoban , arkanoid , ajedrez y tetris .

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 hacer 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) son implícitas, 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:

sed 's/regexp/replacement/g' inputFileName > outputFileName

En algunas versiones de sed, la expresión debe ir precedida de -epara indicar que sigue una expresión. El ssignifica sustituto, mientras que el gsignifica 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 que la sintaxis sea 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 regexpproporciona tanto la coincidencia de patrones y el texto de ahorro a través de sub-expresiones, mientras que el replacementpuede 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 \9de 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 \1en 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 filtrar líneas que solo contienen espacios, o solo contienen el carácter de final de línea:

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 bseguida 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

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 -fopció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.sedse puede crear un archivo con contenido:

#!/bin/sed -f
s/x/y/g

El usuario actual puede convertir el archivo en ejecutable con el chmodcomando:

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 -iopció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/' fileName

Ejemplos de

¡Hola Mundo! ejemplo

# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
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 scomando (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 -fo haciendo que el script en sí 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 -i s/yourpassword/REDACTED/ ./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/firstword//g
s/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:

This is my dog,
 whose name is Frank.
This is my fish,
whose name is George.
This is my goat,
 whose name is Adam.

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:

This is my dog, whose name is Frank.
This is my fish,
whose name is George.
This is my goat, whose name is Adam.

El guión es:

N
s/\n / /
P
D

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 / /; P; 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

Notas

Referencias

Otras lecturas

enlaces externos

Tutoriales

Ejemplos de

Otros enlaces