Actualizado el 21 de Marzo del 2018 (Publicado el 17 de Marzo del 2018)
1.087 visualizaciones desde el 17 de Marzo del 2018
109,1 KB
21 paginas
Creado hace 9a (13/06/2014)
Sed – Introducción a SED – Parte I
Junio 2014
SED - The Stream EDitor - Part I
Este articulo es una introducción a la práctica y uso del editor de flujo “SED”, el articulo intenta
cubrir ciertas funciones poco conocidas, por no decir, casi desconocidas, que hacen de SED
una herramienta indispensable en la caja de herramientas de cualquier usuario de Linux que
desea dominar el manejo del procesamiento de ficheros mediante una consola y un shell.
Índice Parte I
Presentación
Introducción
Sintaxis
Sintaxis general
Sintaxis de un comando
Direccionamiento
Las opciones (argumentos)
Los comandos
Los comandos básicos 1
Flags
Los comandos básicos 2
Los comandos avanzados
Los comandos multi-líneas
Los buffers
Etiquetas
Emplame condicional
Empalme condicional
SED - The Stream EDitor - Part II
Presentación
Sed significa "Stream EDitor" en español “editor de flujo” o “editor de flujo orientado a líneas”.
Por su modo de funcionamiento y concepción, Sed es un editor no interactivo. Al igual que el
editor “ed” (del cual proviene y que lo encontramos aun en las distribuciones actuales), Sed
opera sobre una sola línea a la vez, a diferencia de otros editores como vi, emacs, Nedit, Xedit,
etc., que operan sobre una página completa de texto que aparece en pantalla. El editor “ed”
estaba dotado de un comando que trabajaba sobre el flujo de entrada estándar en vez que sobre
un archivo, y era capaz de mostrar las líneas que contenían una expresión regular. Este
comando cuya sintaxis es "g/re/p" (global/regular expression/print) dio nacimiento a la utilidad
“grep”. Luego aparecería una nueva implementación de una versión de ed, que trabajaba
únicamente sobre el flujo de entrada estándar y recibía las instrucciones de un archivo de script.
Esta versión fue bautizada como Stream EDitor, más conocida con el nombre de “Sed”. El editor
de flujo Sed lee las líneas de uno o varios ficheros desde la entrada estándar, lee los comandos
desde la entrada estándar, o desde un archivo texto (script), y los agrupa bajo forma de
expresiones (comandos de edición), luego aplica estos comandos y escribe el resultado en la
salida estándar. Podríamos resumir el mecanismo de funcionamiento de Sed de esta manera:
Lectura de una línea desde el flujo de entrada (las líneas están delimitada por un carácter
de salto de línea)
La línea es procesada en función de los comandos leídos
Muestra (o no) del resultado en la salida estándar (pantalla)
Continúa con la línea siguiente.
Los comandos aceptan números de líneas, rangos, o expresiones regulares (RE o regex) para
seleccionar la o las líneas sobre las que deben operar
Introducción
Sed recibe las instrucciones o comandos desde la línea de comandos o desde un fichero (script)
y aplica cada instrucción, en el orden en que aparece, a cada línea en la entrada estándar. Una
vez que todas las instrucción han sido aplicadas a la 1ra línea, la línea es mostrada (o no,
dependiendo de lo que se indique) en la salida estándar (la pantalla, o redirigida a un archivo),
luego Sed procede a la lectura y el procesamiento de la siguiente línea y así sucesivamente
hasta el final del archivo de entrada (a menos que encuentre una instrucción de salida) Este
mecanismo es llamado “ciclo”. Se entiende por ciclo a la aplicación de todos los comandos que
componen el script a los datos presentes en el espacio de patrón. Por defecto un ciclo
comprende:
La copia de una línea de entrada al espacio de patrón (la línea estando delimitada por el
carácter fin de línea (\n))
Normalmente el espacio de patrón está vacío, a menos que un comando “D” haya
terminado el ciclo precedente (en ese caso un nuevo ciclo comenzará con los datos
sobrantes en el espacio de patrón).
Sed aplicará los comandos secuencialmente (provenientes de un script o desde la línea de
comandos) a los datos presentes en el espacio de patrón, una vez llegado al final del
script, enviará los datos procesados a la salida estándar, a menos que se indique lo
contrario con la opción "-n", y borrará el espacio de patrón. Todos los datos enviados a la
salida estándar o a un fichero, son seguidos por un carácter de fin de línea (\n).
Copia de una nueva línea o salida si se ha llegado al final del fichero.
Veamos con la ayuda de un organigrama el funcionamiento de Sed mediante un sencillo script
que borra las líneas vacías de un fichero y las líneas que contienen únicamente un carácter
almohadilla (#) al inicio de la línea. Para ello, aquí tenemos un fichero conteniendo algunas
líneas vacías, algunas almohadillas solas, entre ellas una espaciada a la derecha, y dos líneas
con varias almohadillas. El fichero:
#
#
#
##
# Este es un comentario
# Este es otro comentario
#
#
#
###
# Y otro más
#
#
# Y un último comentario
#
El script es relativamente simple. Aquí lo tenemos en una sola línea:
sed -e '/^$/d;/^#$/d'
Y en un script:
#! /bin/sed -f
/^$/d # borrar las líneas vacías
/^#$/d # borrar las líneas conteniendo solo un carácter almohadilla “#”
#+ encontrándose al inicio de la línea y nada detrás
El organigrama: Graforganigr
Sintaxis
Sintaxis general
sed [-opciones] [comando] [<fichero(s)>]
sed [-n [-e comando] [-f script] [-i[.extension]] [l [corte]] rsu] [<comando>] [<fichero(s)>]
Sintaxis de un comando
El direccionamiento de una o varias líneas es opcional en todos los comandos
[dirección[,dirección]][!]comando[argumentos]
Poniendo entre llaves un conjunto de comandos, pueden ser aplicados a una línea o rango de
líneas.
[dirección[,dirección]]{
comando1
comando2
comando3
}
Estos comandos pueden estar puestos en una sola línea, pero deben ser separados por un
punto y coma ( ;).
[dirección[,dirección]]{comando1; comando2; comando3}
Direccionamiento
Sed puede direccionar directamente una línea (o un rango) por su número de línea o por la
coincidencia con una expresión regular haciendo de patrón. Un signo de exclamación (!)
después de un numero de línea, un patrón o una expresión regular evita que la línea (o rango)
sea procesada. El direccionamiento se puede efectuar de la siguientes forma: num
El número de la línea
sed -n 3p fich.txt
inicio~salto
Todas las n líneas (salto) comenzando desde el inicio.
sed -n 1~2p fich.txt
$
/exp/
La última línea del último fichero leído en la entrada, o de cada fichero si las opciones “-i” o
“-s” han sido especificadas.
sed -n '$ p' fich.txt
*sed -ns '$ p' fich*
Todas las líneas que coinciden con la expresión regular exp
sed -n '/est/p' fich2.txt
\#exp#
Todas las líneas que coinciden con la expresión regular exp precisando utilizar como
delimitador el carácter "#" (almohadilla) en lugar del delimitador predeterminado.
sed -n '\#est#p' fich2.txt
num1,num2
Todas las líneas comprendidas entre num1 y num2. Si num2 es inferior a num1, solo num1
es mostrado.
sed -n '3,6 p' fich.txt
/exp1/,/exp2/
Todas las líneas comprendidas entre exp1 y exp2, comprendidas las líneas conteniendo
exp1 y exp2. Si el intervalo conteniendo las 2 expresiones se repite varias veces, Sed
aplicará las instrucciones a cada intervalo sucesivamente. No obstante si exp2 no es
encontrado, las instrucciones son aplicadas a cada línea comenzando por exp1 hasta el
final del fichero.
sed -n '/comentario1/,/comentario2/ p' fich2.txt
num,/exp/ /exp/,num
Todas las líneas comprendidas entre un número de línea y una expresión regular (o a la
inversa). En "num,/exp/", no obstante si exp no es encontrado, las instrucciones son
aplicadas a cada línea comenzando por num hasta el final del fichero. En "/exp/,num", si
num es inferior al numero de línea correspondiente a exp, solo la línea que contiene exp es
mostrada.
sed -n '2,/comentario2/ p' fich2.txt
sed -n '/comentario1/,8 p' fich2.txt
Las opciones (argumentos)
Sed acepta opciones (argumentos), pero no demasiadas. Las mas utilizadas son: "-n", "-e" e "-i".
-n, --quiet, --silent
Solicitud implícita para no mostrar el estado de la memoria principal (buffer). En un script la
notación se hará de esta manera "#n" (un signo almohadilla seguido del carácter “n”) y se
deberá encontrar en la 1ra línea del script.
-e script, --expresión=script
Permite encadenar varios comandos
-f fichero-script, *--file=fichero-script
Lectura de comandos desde el fichero indicado
-i[SUFIJO], --in-place[=SUFIJO]
Edita archivos en el lugar. También da la posibilidad de hacer una copia de respaldo
añadiendo la extensión (-i.BAK)
--posix
Desactiva todas las extensiones de GNU
-r, --regexp-extended
Utiliza expresiones regulares extendidas (ERE)
-s, --separate
Si varios ficheros son ingresados en la entrada, los procesa uno a uno en vez que como
uno solo
-u, --unbuffered
Carga cantidades mínimas de datos desde los ficheros de entrada y libera los
almacenamientos temporales de salida con mayor frecuencia
--help
Muestra esta ayuda y termina
--version
Muestra información acerca de la versión del programa y termina.
Los comandos
En los capítulos que siguen veremos los comandos utilizados por sed. Mientras que el uso de
algunos de ellos puede parecer sencillo, el uso y la implementación de otros dentro de scripts
puede ser un poco más difícil debido a su sintaxis. Algunos comandos admiten un rango de
direcciones mientras que otros solo admiten una e incluso ninguna en una minoría de
comandos.
Los comandos básicos 1
En este capitulo veremos los comandos más conocidos de Sed cuyo uso es relativamente
sencillo. # Comentario (no acepta ninguna dirección)
El carácter # (almohadilla) inicia un comentario que se extiende hasta el final de la línea.
Se puede encontrar en la misma línea de un comando.
Si los dos primeros caracteres de un script Sed son "#n", la opción "-n" (no-autoprint) es forzada.
Por lo tanto si tu script debe empezar necesariamente con una línea de comentario
comenzando con la letra “n” minúscula, utiliza una “N” mayúscula o inserta un espacio
entre la almohadilla (#) y la "n". q quit Abandonar (acepta una dirección)
Abandona sed si
Comentarios de: Sed - Introducción a SED - Parte I (0)
No hay comentarios