Usando Sed

*. Aca vamos a ver un par de ejemplos de como usar sed.*

Sintaxis

sed [options] ‘comand1′ [files]

sed [options] -e ‘comand1′ [-e 'comand2 ...] [files]
* -e especifica que el proximo argumento (cmd) es un comando sed ( o una series de comandos) cuando se especifica unicamente una serie de strings de comandos -e es opcional

sed [options] -f script [files]
*el archivo ‘script’ es propiamente un script

Syntax:
#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
#sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename
    * s is substitute command
    * / is a delimiter
    * REGEXP is regular expression to match
    * REPLACEMENT is a value to replace
Opcion función
d Borra lineas
s Realiza substituciones de texto
g (es un flag para usar con s ) Reemplaza todas las instancias de los patrones
n (es un flag para usar con s ) Reemplaza la instancia numerox, default 1
p (es un flag para usar con s ) Imprime la linea si la substitucion fue correcta. Se usa generalmente con -n
y (es un flag para usar con s ) Traduce caracteres es similar al comando tr
w archivo (es un flag para usar con s ) Imprime la line a un archivo si la substitucion se llevo a cabo

Cuando utilizemos sed tenemos varias formas de usarlo una de ellas es usando expresiones regulares por la cual se usan entre /regex/ pero para entender bien como es el tema lo mejor que se puede hacer es verlo con ejemplos.

Hay infinidad de ejemplos para demostrar el poderio de esta herramienta pero a fines practicos vamos a ver algunos lo demas se lo dejo a uds.

*. El archivo que vamos a usar para los ejemplos.*

[rino@localhost scripting]$ cat test1
#uno
#uno
#uno
#uno
dos
tres
cuatro
cinco
seis
"hola  "

si
[rino@localhost scripting]$

*. Aca vamos a eliminar de la linea 3 a la 5 .*

[rino@localhost scripting]$ sed  '3,5d' test1 > test1.out
[rino@localhost scripting]$ cat test1.out
#uno
#uno
tres
cuatro
cinco
seis
"hola  "

si
[rino@localhost scripting]$

*. Ahora vamos las lineas que contienen # al principio:

[rino@localhost scripting]$ sed  '/^#/d' test1 > test2.out
[rino@localhost scripting]$ cat test2.out
dos
tres
cuatro
cinco
seis
"hola  "

si
[rino@localhost scripting]$

*.Ahora vamos a usar la traduccion de caracteres (todas las o por una x)

[rino@localhost scripting]$ sed 'y/o/x/' test1 > text3.out
[rino@localhost scripting]$ cat text3.out
#unx
#unx
#unx
#unx
dxs
tres
cuatrx
cincx
seis
"hxla  "

si
[rino@localhost scripting]$

*.Ahora vamos a poner un @ en todas las lineas vacias que halla.*

[rino@localhost scripting]$ sed 's/^$/@/' test1 
#uno
#uno
#uno
#uno
dos
tres
cuatro
cinco
seis
"hola  "
@
si
[rino@localhost scripting]$
Presten atencion que aca la linea tiene que estar vacia sin nada sino no cumple con el patron  ^$

.*Ahora vamos a reemplazar todas las “” por un caracter vacio.*

[rino@localhost scripting]$ sed 's/"//g' test1 > test5.out
[rino@localhost scripting]$ cat test5.out
#uno
#uno
#uno
#uno
dos
tres
cuatro
cinco
seis
hola  

si
[rino@localhost scripting]$

*.En los ejemplos que se uso substitucion podiamos obtener la salida a otro archivo y tendriamos que haberlo realizado asi:.*

[rino@localhost scripting]$ sed 's/"//g w rino' test1
[rino@localhost scripting]$ sed 's/^$/@/ w rino1' test1

*. Algunos ejemplos mas:*

Borrar lineas que contienen tab o espacios en blanco.
[rino@localhost scripting]$ sed   '/^[ Tab]*$/d' test1
O tambien asi
[rino@localhost scripting]$ sed  '/^[[:blank]]*$/d' test1
Eliminar todas las lineas que no contengan #noborrar
[rino@localhost scripting]$ sed '/#noborrar/!d' test1 
Eliminar todas las lineas que contienen . o #
[rino@localhost scripting]$ sed  '/^[\.#]/d' test1
Agrega un espacio a cada caracter
[rino@localhost scripting]$ sed  's/ */ /g' test1 
Cambia todas las ocurrencias de abc a def entre las lineas 11 y 20
[rino@localhost scripting]$ sed '11,20s/abc/def/g' test1
Traduce los caracteres xwz a @@@ desde la lina 3 a 20
[rino@localhost scripting]$ sed '3,20y/xwz/@@@/' test1

[rino@localhost scripting]$

*.Ahora vamos a utilizar el sed pero pasandole lo que queremos utilizar desde un archivo.*

Utilizaremos este archivo
[rino@localhost scripting]$ cat test1
""""""
#uno
#uno
#uno
#uno
dos
tres
cuatro
cinco
seis
"hola  "

si
[rino@localhost scripting]$

*Lo que vamos hacer es que en la primera linea dentro de los 10 primeros caracteres busque un determinado caracter en la posicion 2 y 4 y lo reemplaze por otro, luego vamosa reemplazar todas los # por una @ y todas las u por una x. Imaginense que pueden aplicar muchas cosas, esto es solo el comienzo.*

Este archivo es el que contiene la info detallada arriba.

[rino@localhost scripting]$ cat cmd
1,10{
s/"/(/2
s/"/)/4
}
{s/#/@/
s/u/x/
}
[rino@localhost scripting]$

*.Aca ejecuto el comando.*

[rino@localhost scripting]$ sed -f cmd test1 
"("")"
@xno
@xno
@xno
@xno
dos
tres
cxatro
cinco
seis
"hola  "

si
[rino@localhost scripting]$

*. Tambien podria aplicar lo de decirle a donde me mande la salida.*

[rino@localhost scripting]$ cat cmd
1,10{
s/"/(/2
s/"/)/4
w rino1
}
{s/#/@/
s/u/x/
w rino
}
[rino@localhost scripting]$

Tengan en cuenta que el primer archivo rino1 solo va a contener los cambios de la primera llave y el que le sigue va a contener ambos.

*. Les dejo estos links que me paso un amigo... para que vean cuan potente es.....*
Tetris ----> Jugar
Arkanoid ----> Jugar

.* Otra muy buena que no la sabia y me la paso tambien : .*
Con la opcion e ejecuta el resultado de la substitucion..

[root@localhost media]#  ls | sed 's/\(.*\)/echo "\1"/e'
666806DD6806ABBD
bkp
discoint
winchot
[root@localhost media]#

.* Y en honor a el les dejo su frase :.*

Gabriel Pittau -" ...yo no se para que existen los demás lenguajes de programación.."

.* Bueno espero que les halla servido.*

Fuentes para saber mucho mas sobre sed :

http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-append-insert-replace-and-count-file-lines/

http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-how-to-write-to-a-file-using-sed/

http://www.thegeekstuff.com/2009/09/unix-sed-tutorial-delete-file-lines-using-address-and-patterns/

http://www.thegeekstuff.com/2009/09/unix-sed-tutorial-replace-text-inside-a-file-using-substitute-command/

http://www.thegeekstuff.com/2009/09/unix-sed-tutorial-printing-file-lines-using-address-and-patterns/

http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-how-to-execute-multiple-sed-commands/

Share
Creative Commons License
The Usando Sed by ITRestauracion, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
This entry was posted in Scripting and tagged . Bookmark the permalink.

3 Responses to Usando Sed

  1. nippur says:

    Esta excelente el tutoial, no que necesito es reemplazar la /, por ejemplo
    qe de una lista de archivo absoluta
    /bin/sh
    /bin/bash
    cambie a
    /bin2/sh
    /bin2/bash
    como se podria?

    • restauracion says:

      algo asi seria ??
      [root@restauracion opt]# cat test
      /bin/bash
      /bin/sh
      /bin/bash /bin/sh
      [root@restauracion opt]#

      [root@restauracion opt]# sed -e ‘s/\/bin/\/bin2/g’ test
      /bin2/bash
      /bin2/sh
      /bin2/bash /bin2/sh
      [root@restauracion opt]#

      ¿Asi estaria bien?

  2. restauracion says:

    algo asi seria ??
    [root@restauracion opt]# cat test
    /bin/bash
    /bin/sh
    /bin/bash /bin/sh
    [root@restauracion opt]#

    [root@restauracion opt]# sed -e ‘s/\/bin/\/bin2/g’ test
    /bin2/bash
    /bin2/sh
    /bin2/bash /bin2/sh
    [root@restauracion opt]#

    ¿Asi estaria bien?

Leave a Reply