Linux en Espanol
 
Duda con comando sed (tema #24087)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
hinachuu
Forista
Registrado: 2011-10-23
Mensajes: 3

Publicado: 2011-11-01 22:05:26    Asunto: Duda con comando sed

Buen d?a:

Creando un script para la eliminaci?n de usuarios mediante edici?n de texto, me cre? un txt con la siguiente informaci?n para probar cosas sencillas:

juanito:x:501
pepe:x:502
laura:x:503

Con el comando "sed" deseo sustituir la 'x' por un asterisco (*) -esto para, en un script m?s avanzado, bloquearle el login al usuario mediante la edici?n del archivo passwd-. Reemplazando s?lo con un nombre en cuanto se pase un par?metro, funciona perfecto con

read -p "Ingrese usuario a eliminiar: " usuario
cat archivo.txt | sed "s/$usuario/ejemplonombre/g" > archivo.txt

lo que hace que el par?metro que ingres? sea reemplazado por "ejemplonombre".

Mi drama es cuando quiero hacer la modificaci?n incluyendo un patr?n completo de la siguiente manera

cat archivo.txt | sed "s/$usuario:x/$usuario:*/g" > archivo.txt

lo cual me borra todo el contenido del archivo :/

Mi pregunta es, ?qu? est? mal? ?alguna mala manera de pasar mal el patr?n?

Acepto sugerencias, pero no me vengan con que "te est?s liando mucho, usa equiz comando para todo, porque esto es un trabajo con instrucciones dadas por mi profesor de universidad.



Eso, muchas gracias.
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2011-11-02 00:40:18    Asunto:

Hola.

Tu problema no est? en "sed". He ejecutado tu script y funciona correctamente si el fichero de salida difiere del fichero de entrada.
Es decir, esto falla:
sed [b:68d30de3e2]fichero[/b:68d30de3e2] "s/busca/cambia/g" > [b:68d30de3e2]fichero[/b:68d30de3e2]
Y esto funciona:
sed [b:68d30de3e2]fichero[/b:68d30de3e2] "s/busca/cambia/g" > [b:68d30de3e2]diferente[/b:68d30de3e2]

El problema est? en que al volcar la salida machacando la entrada, ?sta se borra entera.

Yo te recomiendo algo as?:
[code:1:68d30de3e2]#!/bin/bash
#
# CONFIGURACION
ORIGEN=archivo.txt
TEMPORAL=$ORIGEN.tmp

#
# PROGRAMA
read -p "Ingrese usuario a eliminiar: " usuario
cat $ORIGEN | sed "s/$usuario:x/$usuario:*/g" > $TEMPORAL
cp -p $ORIGEN $ORIGEN.$(date +%Y.%m.%d-%H.%M.%S)
chmod --reference=$ORIGEN $TEMPORAL
rm $ORIGEN
mv $TEMPORAL $ORIGEN
[/code:1:68d30de3e2]

Saludos.
TheBalrog
BOFH
Registrado: 2004-04-05
Mensajes: 3012

Publicado: 2011-11-02 00:41:04    Asunto:

Limosnero y con garrote.
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2011-11-02 01:13:32    Asunto:

Hola.
[quote:42a451d99f="TheBalrog"]Limosnero y con garrote.[/quote:42a451d99f]
?Es una frase hecha de M?xico?

?Podr?as traducir, por favor?

Saludos.
TheBalrog
BOFH
Registrado: 2004-04-05
Mensajes: 3012

Publicado: 2011-11-02 01:50:03    Asunto:

S?, es un dicho mexicano. Quiere decir que pide algo y pone condiciones para recibirlo. En este caso lo digo pues pide ayuda con un tema pero adem?s pone condiciones pues reconoce que es una tarea. Por eso es que le digo "limosnero y con garrote".
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2011-11-02 18:39:09    Asunto:

Hola.

S? Balrog, yo soy de la misma opini?n que t? (y otros muchos foreros) respecto a no resolverle la tarea a nadie, puesto que si est?n estudiando es para aprender. Pero en este caso concreto, le han puesto una tarea de uso del comando sed y la ha resuelto correctamente antes de pedir ayuda aqu?. De hecho el error no lo podr?a haber encontrado en la documentaci?n de sed, ya que era una cuesti?n de redirecci?n de archivos.
Yo lo veo dentro de la categor?a de "tareas no, dudas concretas s?".

Respecto a lo de "limosnero y con garrote", me ha gustado, lo apuntar? para usarlo alguna vez, aunque me temo que aqu? (Espa?a) poca gente lo entender?.

Un abrazo.
rafaxdrake
Forista


Registrado: 2004-02-21
Mensajes: 3928

Publicado: 2011-11-02 20:09:21    Asunto:

suscribo lo dicho por miguel, el usuario est? realizando una tarea, se est? esforzando, pero no lo consigue y pide ayuda, lo cual es correcto en mi opini?n.
TheBalrog
BOFH
Registrado: 2004-04-05
Mensajes: 3012

Publicado: 2011-11-02 20:33:07    Asunto:

miguelgf de hecho tienes raz?n, estoy de acuerdo con la apreciaci?n. Est? pidiendo ayuda pues se ator? con algo, aunque insisto, no me gusta la actitud.

Eso es cuesti?n de enfoque, pero en lo general, concuerdo contigo. Lo triste del asunto es que el usuario no da se?ales de vida.
hinachuu
Forista
Registrado: 2011-10-23
Mensajes: 3

Publicado: 2011-11-02 22:18:33    Asunto:

[quote:58fdb4f92f="miguelgf"]Hola.

Tu problema no est? en "sed". He ejecutado tu script y funciona correctamente si el fichero de salida difiere del fichero de entrada.
Es decir, esto falla:
sed [b:58fdb4f92f]fichero[/b:58fdb4f92f] "s/busca/cambia/g" > [b:58fdb4f92f]fichero[/b:58fdb4f92f]
Y esto funciona:
sed [b:58fdb4f92f]fichero[/b:58fdb4f92f] "s/busca/cambia/g" > [b:58fdb4f92f]diferente[/b:58fdb4f92f]

El problema est? en que al volcar la salida machacando la entrada, ?sta se borra entera.

Yo te recomiendo algo as?:
[code:1:58fdb4f92f]#!/bin/bash
#
# CONFIGURACION
ORIGEN=archivo.txt
TEMPORAL=$ORIGEN.tmp

#
# PROGRAMA
read -p "Ingrese usuario a eliminiar: " usuario
cat $ORIGEN | sed "s/$usuario:x/$usuario:*/g" > $TEMPORAL
cp -p $ORIGEN $ORIGEN.$(date +%Y.%m.%d-%H.%M.%S)
chmod --reference=$ORIGEN $TEMPORAL
rm $ORIGEN
mv $TEMPORAL $ORIGEN
[/code:1:58fdb4f92f]

Saludos.[/quote:58fdb4f92f]

Much?simas gracias, Miguel, me sacaste de un detalle peque?o :)





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