Comando Sed Introduccion Parte II
Comando Sed Introduccion Parte II
Comando Sed Introduccion Parte II
Marzo 2015
Los delimitadores
Delimitadores de comandos
De manera predeterminada, Sed utiliza como delimitador para su mecanismo de substitucin la barra oblicua / (slash):
sed 's/patrn/reemplazo/' fichero
Para la mayora de casos, esta opcin por defecto resulta suficiente, pero puede resultar un problema si el patrn o la cadena de reemplazo tambin
contienen uno o ms slashes como en el caso de la ruta de un archivo. Evidentemente puedes proteger los slashes anteponindoles un / (anti-slash o barra
oblcua invertida), pero esto resulta una operacin muy fastidiosa si el patrn (o la cadena de reemplazo) contiene varios, volviendo la lectura del cdigo
bastante difcil:
sed 's/\/home\/jp\/Docs\/CCM\/SED/\/mnt\/servidor\/docs/' fichero
Hasta puede ser imposible si el patrn (o la cadena de reemplazo) es una variable que debe ser interpretada:
var="/home/jp/Documentos/CCM/SED/"
sed 's/'$var'/\/mnt\/servidor\/docs/' fichero
o (expresin entre doble apstrofes)
sed "s/$var/\/mnt\/servidor\/docs/" fichero
Felizmente, Sed permite reemplazar el delimitador por defecto con el carcter de nuestra eleccin (#,|,!,,etc.), siempre y cuando no forme parte del patrn
(o la cadena de reemplazo):
sed 's#/home/jp/Docs/CCM/SED#/mnt/servidor/docs#' fichero
Este carcter puede ser cualquier letra siempre y cuando no est contenida en el patrn (o la cadena de reemplazo):
echo "hola" | sed 'sZbZBZ'
Si utilizas el carcter ! (signo de exclamacin) como separador, debes encerrar la expresin con apostrofes simples para que el shell no interprete el
carcter ! (empleado normalmente para gestionar el historial de los comandos).
Delimitador de patrn
Como lo hemos visto, Sed utiliza un patrn, encerrado entre / (slash), para buscar coincidencias en las lneas de un fichero. El slash utilizado por defecto,
puede ser cambiado por cualquier otro carcter, simplemente anteponiendo a la primera ocurrencia de este carcter un \ (backslash). Tomemos el ejemplo
de una ruta como criterio de bsqueda. Bajo est forma, vemos que la lectura del cdigo no es fcil:
sed -n '/\/home\/jp\/Docs\/CCM\/SED/p' fichero
Sin embargo, si utilizamos el carcter almohadilla # como delimitador, tendremos:
sed -n '\#/home/jp/Docs/CCM/SED#p' fichero
El metacaracter '&'
A menudo, el mecanismo de substitucin se limita a buscar un patrn a fin de substituirlo por si mismo y agregndole algo, por ejemplo, buscar la cadena
Sed the Stream EDitor en un fichero y agregarle Sed the Stream EDitor (Editor de flujo). Podramos escribir:
sed 's/Sed the Stream EDitor/Sed the Stream EDitor (Editor de flujo)/g' fichero
El metacaracter & (Ampersand) nos permite reemplazar todas las cadenas de caracteres que coinciden con el patrn (o la expresin regular) ingresado
como 1er argumento.
Aqu la nocin de primer argumento no es muy explicita, pero se vera su importancia con las expresiones regulares y en el capitulo de las subexpresiones. Por lo tanto nuestro comando se escribir de esta manera:
sed 's/Sed the Stream EDitor/& (Editor de flujo)/g' fichero
Supongamos que tenemos que buscar todas las cadenas numricas (1 o varias cifras consecutivas) en un fichero y deseamos anteponer a cada una de
estas cadenas n (observa el espacio despus de el ). El comando seria:
sed 's/[0-9][0-9]*/n &/g' fichero
Necesariamente se debe utilizar la expresin \& para obtener un & literal en una cadena de reemplazo, si no se generarn errores.
Las subexpresiones
\(...\) Una subexpresin es una parte de una expresin regular, encerrada entre parntesis, que posteriormente podemos utilizar en la substitucin. Los
parntesis deben ser protegidos con backslashes, a menos que la opcin -r haya sido empleada.
66000
Una referencia hacia atrs puede llamar a una subexpresin las veces que se desee en la cadena de reemplazo. Retomando el ltimo ejemplo, veamos la
demostracin con la repeticin de la tabulacin en diversos lugares:
$ sed 's/\([0-9]*\)\(\t\)\(.*\)/\2\3\2\2\1/' plop
Toulouse
31000
Montpellier
34000
Perpignan
66000
La negacin
A veces puede ser til excluir una lnea que coincide con un patrn (o un rango de lineas) para que no sea procesada. Para ello, Sed utiliza el carcter !
(signo de exclamacin) que como en la mayora de herramientas derivadas de Unix expresa la negacin, exactamente como lo hace el comando grep -v.
Para ello, tan solo hay que poner a continuacin del patrn (o el numero de lnea o rango de lineas) el carcter !:
sed -n '3 !p' fich.txt
sed -n '3,8 !p' fich.txtsed -n '/indice/! p' fich3.txt
A menudo encontramos en los scripts Sed, la expresin $! que significa mientras no se alcance la ultima lnea y permite efectuar uno o varios comandos
mientras esta condicin sea verdadera. Podemos comparar diferentes maneras de escribir la sintaxis de un comando, pero obteniendo un mismo resultado.
echo -e 'a\nb\n\nc\nd\ne\n\nf\ng' | sed '/./! d'
echo -e 'a\nb\n\nc\nd\ne\n\nf\ng' | sed '/^$/ d'echo -e 'a\nb\n\nc\nd\ne\n\nf\ng' | sed -n '/^$/! p'echo -e 'a\nb\n\nc\nd\ne\n\nf\ng' | sed -n '/./ p'
La agrupacin de comandos
/direccin/{...} (acepta un rango de direcciones) Las llaves permiten agrupar comandos que sern ejecutados en una direccin o en un rango de
direcciones. Dentro de la agrupacin de estos comandos podemos encontrar otras direcciones as como otros comandos agrupados tambin entre llaves.
Su principal funcin, indicar una lnea (o rango de lneas) y aplicar sucesivamente uno o varios comandos. El procesamiento es realizado sobre el
contenido del buffer y no sobre la lnea original, por lo que las modificaciones realizadas pueden condicionar los criterios de seleccin posteriores.
sed '
/a/{ # solo la lnea que contiene "a"s/a/c/g # reemplazar todas las "a" por "c"/c/{
# solo la lnea que contiene "c" de la lnea que coincides/c/A/g # reemplazar todas
En un grupo de comandos (en un script), cada comando debe iniciar sobre su propia lnea, las llaves y el conjunto de comandos deben estar en lneas
separadas. La llave que abre debe encontrarse al final de la lnea, mientras que la llave que cierra debe necesariamente encontrarse sola en una lnea.
Atencin, no debe haber ningn espacio despus de las llaves.
El reemplazo de variables
Puede darse el caso que dentro de un script Sed necesitemos pasar una variable como argumento, ya sea como patrn o en una u otra de las partes (LHS o
RHS) durante una substitucin. Como lo mencione anteriormente, habr que prestar atencin a los caracteres presentes en la variable a fin de adaptar los
apstrofes a utilizar. En efecto, por defecto Sed utiliza apstrofes simples para encerrar las expresiones, pero este mecanismo en shell bloquea justamente
la expansin de las variables; por lo que el empleo de apstrofes simples impedir una buena interpretacin de la variable.
var=A; echo 'azerty' | sed 's/a/$var/'
$varzerty
Inicialmente, es posible reemplazar estos apstrofes simples por apstrofes dobles, lo que en la mayora de casos ser suficiente para permitir la
interpretacin correcta de la variable.
Otros
\` coincide con una cadena nula al inicio de la lnea (idntico a ^). ' coincide con una cadena nula al final de la lnea (idntico a $). \b coincide con una
cadena vaca al extremo de una palabra. Denota el lmite entre una palabra y un carcter que no sea una palabra. \B coincide con una cadena vaca que no
se encuentre al extremo de una palabra. Denota el lmite entre un carcter, salvo una palabra, y una palabra. \w cualquier palabra de la clase: [A-Za-z0-9_]
(underscore _ incluido). \W cualquier palabra que no pertenezca a la clase: [^A-Za-z0-9_] (underscore _ incluido) \s cualquier carcter de espaciado:
espacio, tabulacin horizontal o vertical. \S uno o varios caracteres de espaciado. \< coincide con una cadena vaca al inicio de una palabra. \> coincide con
una cadena vaca al final de una palabra. \e fin de conversin de maysculas o minsculas. \l conversin del prximo carcter en minscula. \L conversin
de los caracteres restantes en minscula. \u conversin del prximo carcter en mayscula. \U conversin de los caracteres restantes en mayscula.
[:alnum:] caracteres alfanumricos [A-Za-z0-9] [:alpha:] caracteres alfabticos [A-Za-z] [:digit:] cifras [0-9] [:lower:] caracteres en minsculas [a-z] [:upper:]
caracteres en maysculas [A-Z] [:print:] caracteres imprimibles [ -~] [:punct:] caracteres de puntuacin [!-/:-@[-`{-~] [:space:] espacios, tabulaciones y
cualquier carcter vaco [ \t\v\f]. [:blank:] espacio y tabulacin [ \x09]. [:graph:] cualquier carcter imprimible [!-~] (excepto los espacios vacos). [:cntrl:]
caracteres de control [\x00-\x19\x7F]. [:xdigit:] nmeros hexadecimales [0-9a-fA-F].
Windows
GnuWin32-Sed v4.1.5 Descargar. La versin ejecutable para MS Windows 95 / 98 / ME / NT / 2000 y XP.
Depuradores
A continuacin 2 depuradores que te permitirn comprender mejor el funcionamiento de Sed y, en algunos casos, te ahorrarn enormes horas de trabajo.
sd.ksh y sd.sh.txt son dos pequeos scripts escritos en Korn shell y Bourne shell respectivamente que incluyen un manual de uso al final del fichero. sedsed
est escrito en Python (por lo que debe ser instalado en tu sistema) y te permite visualizar el estado del buffer y los comandos interpretados. A continuacin
un mini tutorial para el uso de sedsed.
Usage : sedsed OPTION [-e sedscript] [-f sedscriptfile] [inputfile]
OPCIONES: -f, --file
lectura de los comandos desde el fichero indicado
-e, --expression
-n, --quiet
solicitud impl
Significado a la salida: PATT: Muestra el contenido del espacio patrn (memoria principal). HOLD: Muestra el contenido de la memoria secundaria. COMM:
El comando SED debe ser ejecutado. $ Delimita el contenido de PATT y HOLD. La sintaxis ms comn es el modo debug simple (-d):
echo -e "AAA\nBBB\nCCC\nDDD" | sed '/BBB/ {n;s/C/Z/2}'
echo -e "AAA\nBBB\nCCC\nDDD" | sedsed -d '/BBB/ {n;s/C/Z/2}'
<a href='http://www.commentcamarche.net/faq/images/0-B4IoZAnt-debogage-d.png'><a href='http://www.commentcamarche.net/faq/images/0-B4IoZAntdebogage-d.png'>
Cuando ya existen herramientas apropiadas y efectan la tarea fcilmente y con mayor rapidez, por ejemplo: Bsqueda de patrn simple: grep "patrn"
fichero # sed -n "/patrn/p' fichero Exclusin de un patrn simple: grep -v "patrn" fichero # sed "/patrn/!d' fichero Bsqueda de patrn y visualizacin
de lneas de contexto antes/despus: grep -A1 -B1 "patn" fichero # sed -n '/patrn/! {x;d;}; /patrn/{x;p;x;p;n;p;x;}' fichero Numeracin de lneas: cat -n
fichero # sed -e '=' fichero | sed 'N;s/\n/\t/' nl fichero Eliminacin de saltos de lnea tr '\n' ' ' < fichero# sed ':bucle; N; $! b bucle; s/\n//g' fichero Eliminacin
de caracteres individuales tr -d "[w-z]" < fichero # sed 's/[w-z]//g' fichero Repeticin de caracteres echo "Booonjoouuur" | tr -s "ou" # echo "Booonjoouuur"
| sed 's/oo*/o/g;s/uu*/u/' Transposicin de caracteres echo "ABCDEF" | tr "[A-F]" "[a-f]" # echo "ABCDEF" | sed 'y/ABCDEF/abcdef/' Formato de ficheros,
mejor utilizar los comandos: fold, fmt y par. Para ciertas tareas que awk y perl las realizan mucho mas fcil y rpido, como por ejemplo: contar campos y
caracteres, contar lneas de un bloque u objetos de un fichero, operaciones matemticas, calcular la longitud de una cadena, manipular datos binarios,
bucles en tablas o listas, etc.
Referencias
A continuacin encontraras algunas obras as como los sitios Web que utilice para elaborar este artculo.
Libros
sed & awk, Second Edition
Enlaces
Principiantes y conocedores
info sed man sed Sed - An Introduction and Tutorial THE SED FAQ sed, a stream editor HANDY ONE-LINERS FOR SED
Avanzados
scripts tutoriales
IRC
Freenode irc://irc.freenode.net/#sed
El documento Sed: Introduccin a SED - Parte II de Kioskea (es.kioskea.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo bajo las
condiciones sealadas por esta licencia. Debers hacerla siempre visible y dar crdito a Kioskea.