Linux en Espanol
 
Sed no es para mi (tema #24748)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-07-22 17:26:36    Asunto: Sed no es para mi

Hola buenas estaba haciendo un script que eliminase estas lineas del fichero /etc/modprobe.d/blacklist.conf

[code:1:a0b906adb4]
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv[/code:1:a0b906adb4]

Entonces pens? usar el comando sed vi un tuto donde decia

sed '/contenido de la linea/d' fichero
con eso se elimina la linea que contenga lo que tu quieras y es cierto pero si sobre el mismo fichero ejecutas lo mismo con otra linea vuelve la que ya borraste ?Por qu?? No lo se....

por eso no funcionaba lo que pense desde un principio
esto:
[code:1:a0b906adb4]sed '/blacklist vga16fb/d' /etc/modprobe.d/blacklist.conf
sed '/blacklist nouveau/d' /etc/modprobe.d/blacklist.conf
sed '/blacklist rivafb/d' /etc/modprobe.d/blacklist.conf
sed '/blacklist nvidiafb/d' /etc/modprobe.d/blacklist.conf
sed '/blacklist rivatv/d' /etc/modprobe.d/blacklist.conf[/code:1:a0b906adb4]

Luego prob? con

[code:1:a0b906adb4]sed '/"blacklist vga16fb"/,/"blacklist rivatv"/d'[/code:1:a0b906adb4]
que supuestamente elimina desde "blacklist vga16fb" hasta "blacklist rivatv" pero por algun motivo no lo hace no se si es por los espacios no lo se....

Y esa es mi historia con sed siempre que he querido hacer algo me hace cosas que no suelen hacer los comandos a los que acostumbro usar no se por que lo hicieron tan raro...

dejando mi odio hac?a sed me gustar?a saber como podr?a eliminar esas l?neas de ese fichero de manera autom?tica sea con el comando que sea incluso sed XD

Bueno un saludo y gracias de antemano 8)
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-07-22 18:01:00    Asunto: Re: Sed no es para mi

Hola.[quote:abbae35729="cazademonios"]sed '/contenido de la linea/d' fichero
con eso se elimina la linea que contenga lo que tu quieras y es cierto pero si sobre el mismo fichero ejecutas lo mismo con otra linea vuelve la que ya borraste ?Por qu?? No lo se....
[/quote:abbae35729]
El problema es que no est?s haciendo nada con la salida de "sed". "sed" no modifica el fichero, toma un flujo de caracteres de entrada y devuelve otro flujo modificado. En tu caso, el flujo de entrada es el fichero y el de salida es la consola. Por eso lees la salida correctamente pero no persiste en el fichero.
Prueba:
[code:1:abbae35729]sed '/blacklist vga16fb/d' /etc/modprobe.d/blacklist.conf > salida.txt[/code:1:abbae35729]
Ver?s como a salida.txt s? le falta la l?nea no deseada. ?Por qu?? Porque has redirigido el flijo de salida a un fichero para que el cambio sea persistente.
Lo que no debes hacer es redirigir el flujo de salida al mismo fichero de entrada as?:
[code:1:abbae35729]sed '/blacklist vga16fb/d' /etc/modprobe.d/blacklist.conf > /etc/modprobe.d/blacklist.conf[/code:1:abbae35729]
Seguramente te destrozar? el fichero porque lo sobreescribes a la vez que lo lees.


El segundo paso es encadenar varios "sed". Podr?amos pensar en algo as?:
[code:1:abbae35729]sed '/blacklist vga16fb/d' /etc/modprobe.d/blacklist.conf > salida1.txt
sed '/blacklist nouveau/d' salida1.txt > salida2.txt
sed '/blacklist rivafb/d' salida2.txt > salida3.txt[/code:1:abbae35729]
Eso funcionar?a pero sembrar?amos el disco de ficheros auxiliares salida1.txt, salida2.txt y no queremos llenarlo todo de basura. Para eso est?n las tuber?as, que redirigen el flujo de salida de una orden como flujo de entrada de la siguiente. Prueba:
[code:1:abbae35729]sed '/blacklist vga16fb/d' /etc/modprobe.d/blacklist.conf | sed '/blacklist nouveau/d' | sed '/blacklist rivafb/d' > salida.txt[/code:1:abbae35729]
Ver?s como a salida.txt le faltan las tres l?neas que hemos querido eliminar.

Finalmente, si deseas que los cambios no est?n en salida.txt sino en el fichero original /etc/modprobe.d/blacklist.conf, mueve uno sobre el otro:
[code:1:abbae35729]mv salida.txt /etc/modprobe.d/blacklist.conf [/code:1:abbae35729]

Entendiendo esto de los flujos, que es igual para muchas herramientas linux (sed, awk, sort, ...), ver?s como "sed" es una herramienta muy ?til.

Saludos.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries