Ejercicios de sed

De Jose Castillo Aliaga
Revisión del 15:26 2 may 2013 de Admin (discusión | contribs.) (→‎Soluciones)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda
La versión para imprimir ya no se admite y puede contener errores de representación. Actualiza los marcadores del navegador y utiliza en su lugar la función de impresión predeterminada del navegador.

Estos ejercicios complementan al artículo principal de sed

Ejercicios de sustitución

Enunciados

1- Modifica la IP de un ordenador por la dirección de la red. (por ejemplo de 192.168.3.5 a 192.168.3.0)

2- Cambia del PATH, el /usr/bin por /home/lliurex/bin

3- Pon una palabra determinada entre comillas

4- Pon una coma entre la primera palabra y las demás de una línea:

5- Convierte 123456789abc en una dirección MAC

6- De todas las líneas de /etc/passwd, muestra el directorio home y luego el nombre

7- Tenemos un fichero como este:

Martínez Pérez, P. (1995). Sed o no sed.
García Gómez, R. (2010). Instalar Linux y tener sed.
Smith, M., & Doe, J. (1989). First steps with sed.

Queremos tener una salida como esta:

Martínez Pérez 1995
García Gómez 2010
Smith 1989

Soluciones

1- Modifica la IP de un ordenador por la dirección de la red. (por ejemplo de 192.168.3.5 a 192.168.3.0)

   $ echo 192.168.0.5 | sed 's/.[0-9]\+$/.0/'

2- Cambia del PATH, el /usr/bin por /home/lliurex/bin

   $ echo $PATH | sed 's_/usr/bin_/home/lliurex/bin_'

3- Pon una palabra determinada entre comillas

   $ echo 'El so Windows' | sed 's/so/"&"/'

4- Pon una coma entre la primera palabra y las demás de una línea:

   $ echo pienso luego existo | sed 's/[a-z]\+/&,/' 

5- Convierte 123456789abc en una dirección MAC

   $ echo 123456789abc | sed -e 's/../&:/g' -e 's/:$//'

6- De todas las líneas de /etc/passwd, muestra el directorio home y luego el nombre

   $ cat /etc/passwd | sed 's/^\([A-Za-z0-9]\+\):[^:]*:[^:]*:[^:]*:[^:]*:\(.*\):.*/\2 \1/g' 
   $ cat /etc/passwd | cut -d":" -f1,6 | sed 's/\(.*\):\(.*\)/\2 \1/'

7-

   $ sed -r 's/^([^,]+)[^0-9]+([0-9]+).*$/\1 \2/' bibliografia.txt
   $ sed -r 's/(,.*\(|\).*)/ /g' bibliografia.txt

Ejercicios de limitar sed a ciertas líneas

Enunciados

1- Elimina el head de un html

2- Quita las últimas 5 líneas a un documento

Soluciones

1- Elimina el head de un html

   cat index.html | sed -e 's/<head>/\n<head>\n/g' -e 's_</head>_\n</head>\n_g' | sed '/<head>/,/<\/head>/ d'
   Primero añade un salto de línea a cada head para evitar eliminar otras etiquetas, luego borra entre dos expresiones regulares

2- Quita las últimas 5 líneas a un documento

   lineas=$(cat index.html | wc -l)
   cat -n index.html | sed "$(($lineas-5)),$ d"

Ejercicios de agrupar con { }

Enunciados

1- Del head de un html, añade en los enlaces el prefijo "tema/", por ejemplo: href="estilos.css" sería href="tema/estilos.css"

2- En el fichero /etc/passwd, sobre tu usuario, añade /net/usuarios a tu home, cambia el bash por sh y haz que tu grupo sea el 1002

3- Haz ifconfig y se lo pasas por pipe al sed, sobre la tarjeta eth0, modifica su IP a 192.168.100.100 y cambia, en su MAC, los 0 por 1.

4- Imprime del fichero de /var/log/syslog los logs relacionados con la Ip principal

Soluciones

1- Del head de un html, añade en los enlaces el prefijo "tema/", por ejemplo: href="estilos.css" sería href="tema/estilos.css"

   cat index.html | sed '/<head>/,/<\/head>/ {
   s_\(href="\)\(.*\.[a-z]*\)_\1tema\/\2_g
   }'

2- En el fichero /etc/passwd, sobre tu usuario, añade /net/usuarios a tu home, cambia el bash por sh y haz que tu grupo sea el 1002

   cat /etc/passwd | sed '/lliurex/ {
   s_\(/home\)_/net/usuarios\1 _
   s/bash/sh/
   s/\(lliurex:x:[0-9]*:\)[0-9]*/\11002/
   }'
   # otra solución para el home
   cat /etc/passwd | sed '/lliurex/ {
   s_\/home_/net/usuarios& _
   s/bash/sh/
   s/\(lliurex:x:[0-9]*:\)[0-9]*/\11002/
   }'


3- Haz ifconfig y se lo pasas por pipe al sed, sobre la tarjeta eth0, modifica su IP a 192.168.100.100 y cambia, en su MAC, los 0 por 1.

   ifconfig | sed '/eth0/,/^$/ {
   s/\(inet:\)[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/\1192.168.100.100/
   /HW/ {
   s/0/1/g
   }
   }'

4- Imprime del fichero de /var/log/syslog los logs relacionados con la Ip principal

   cat /var/log/syslog | sed -n '/Apr 19/ { 
   /10.20.2/p}'

Ejercicios de añadir o cambiar líneas

Enunciados

1- En el /etc/network/interfaces, sustituye una ip por dhcp por una estática.

2- En un html, añade un <div id="footer"></div> antes del </body>

3- Añade dos líneas con tu información, licencia y demás a un script después del #!/bin/<el shell que sea>

Soluciones

1- En el /etc/network/interfaces, sustituye una ip por dhcp por una estática.

   cat /etc/network/interfaces | sed '/dhcp/ { 
   s/dhcp/static/
   a\
   address 192.168.0.2 \
   netmask 255.255.255.0
   }'

2- En un html, añade un <div id="footer"></div> antes del </body>

   cat index.html | sed '/<\/body>/ i\
   <div id="footer"> \
    </div>'

3- Añade dos líneas con tu información, licencia y demás a un script después del #!/bin/<el shell que sea>

   cat script.sh | sed  '/\#!\/bin\// a\
   #Jose Castillo \
   #Licencia GNU etc...'

Ejercicios Varios

Enunciados

1. Haz un nuevo fichero llamado 1.sed que tenga sólo las líneas 1,2,3,4,5 del fichero de entrada.

2. Haz un nuevo fichero llamado 2.sed que tenga solo las líneas 9,12,14 del fichero de entrada.

3. Muestra las líneas que contengan la palabra "linea" del fichero original.

4. Muestra las líneas que contienen caracteres numéricos.

5. Muestra las líneas que contienen todas las líneas del fichero original, pero se debe sustituir las palabra "linea" por "entrada", asegurate que también se cambia Linea por Entrada.

6. Muestra las líneas que no contienen caracteres numéricos.

7. Muestra el fichero de entrada que reemplace cualquier carácter numérico con una línea de tres X.

8. Muestra el fichero de manera que añada una nueva línea detrás de cada línea que tenga caracteres numéricos.

9. Pon en mayúscula la primera letra de cada línea

Soluciones

1. Haz un nuevo fichero llamado 1.sed que tenga sólo las líneas 1,2,3,4,5 del fichero de entrada.

   sed -n '1,5 p' > 1.sed

2. Haz un nuevo fichero llamado 2.sed que tenga solo las líneas 9,12,14 del fichero de entrada.

   sed -n -e '9 p' -e '12 p' -e '14 p' > 2.sed

3. Muestra las líneas que contengan la palabra "linea" del fichero original.

   sed -n '/linea/ p'

4. Muestra las líneas que contienen caracteres numéricos.

   sed -n '/[0-9]/ p'

5. Muestra las líneas que contienen todas las líneas del fichero original, pero se debe sustituir las palabra "linea" por "entrada", asegurate que también se cambia Linea por Entrada.

   sed 's/linea/entrada/g
   s/Linea/Entrada/g'

6. Muestra las líneas que no contienen caracteres numéricos.

   sed -n '/[0-9]/! p'

7. Muestra el fichero de entrada que reemplace cualquier carácter numérico con una línea de tres X.

   sed 's/[0-9]/XXX/g'

8. Muestra el fichero de manera que añada una nueva línea detrás de cada línea que tenga caracteres numéricos.

   sed '/[0-9]/ a\ '

9. Pon en mayúscula la primera letra de cada línea

   sed 's/^./\u&/'