PDA

View Full Version : Tarea para el Hogar (Shell Script)


Daggy
12-17-2007, 04:15 PM
a ver si los grosos de linux se prenden con esta tarea que tengo asignada y no la puedo terminar de descular

tengo que hacer un script que tome un archivo y remplece todos los Tab del mismo por una cierta cantidad de espacios

si los espacios fueran siempre la misma cantidad no habria problemas
pero ete aqui que la cantidad de espacios al igual que el archivo los elije el usuario

Le mando el escript que hice hasta el momento , que falla en la cantidad de espacios, o sea de la forma que esta escrito remplaza los Tab por un espacio, pero necesitaria que tome la eleccion del usuario

Script hasta el momento:

#!/bin/sh

echo "escriba el nombre del archivo al que le desea aplicar el escript"
read Archivo
echo "Indique el numero de espacios con los que remplazara cada Tab"
read Espacio

sed -r 's/\t/ /g' < $HOME/$Archivo >> $HOME/ArchivoTemp

mv $HOME/ArchivoTemp $HOME/$Archivo



Nota: no debo usar el camando format
Saludos y gracias por cualquier ayuda

Sayos
12-17-2007, 04:29 PM
Hola Daggy!!!!!!!

arlick
12-17-2007, 04:31 PM
cagarruta:


#!/bin/sh

echo "primer argumento: $1";
echo "segundo argumento: $2";
echo "tercer argumento: $3";


chmod +x cagarruta
./cagarruta lero leri larara

primer argumento: lero
segundo argumento: leri
tercer argumento: larara

edit: creo que me he liado, debe ser que lo escriba duranta la ejecución del script?

arlick
12-17-2007, 04:39 PM
aca lo tienes :biggrin:

http://snippets.dzone.com/posts/show/3143

Luego faltaría lo de que si no es número que pidiese de nuevo que lo introdujese y para meterle X espacios hacer un for y meta tantos espacios como es la varible, y al final quitar el tabulador.

Si no se puede hacer así una forma alternativa es por cada vez que lea un tabulador escribir espacio+tabulador. En la última iteración escribes solo espacio o bien después de todas las interaciones sustituyes tabulador por espacio nulo.

Nuse si te servirá así :sifflote:

Daggy
12-17-2007, 06:15 PM
Hola Daggy!!!!!!!



Hola Sy

como va??

arlick
12-17-2007, 06:16 PM
Ahí lo tienes, me debes una :P


#!/bin/sh

echo "escriba el nombre del archivo al que le desea aplicar el escript"
read Archivo

#Control para que repita la pregunta si no introduce un número.

while :
do
echo "Indique el numero de espacios con los que remplazara cada Tab"
read Espacio

if [ $Espacio -eq $Espacio 2> /dev/null ]; then
break;
fi
done

#Iniciando las operaciones. El fichero operara en la carpeta /tmp/ y sobreescribirá el fichero original al final.

cp $HOME/$Archivo /tmp/$Archivo"0";

#Por cada iteración escribe una tabulación+espacio por cada tabulación, hasta el número indicado -1.
#Una vez que llega a la iteración número indicado -1 sale del bucle y realiza otra operación sobreescribiendo
#Las tabulaciones restantes por un espacio.

for (( i = 0 ; i < $Espacio-1; i++ ))
do
sed -r 's/\t/\t /' < /tmp/$Archivo"0" > /tmp/$Archivo"2";
cp /tmp/$Archivo"2" /tmp/$Archivo"0";
done

sed -r 's/\t/ /' < /tmp/$Archivo"0" > /tmp/$Archivo"2";

#Sobreescribe el fichero original por el generado y elimina los archivos temporales utilzados.

#cat /tmp/$Archivo"2";
cp /tmp/$Archivo"2" $HOME/$Archivo;
rm -f /tmp/$Archivo*;


hoy tengo la tarde aburrida...

Daggy
12-17-2007, 06:23 PM
aca lo tienes :biggrin:

http://snippets.dzone.com/posts/show/3143

Luego faltaría lo de que si no es número que pidiese de nuevo que lo introdujese y para meterle X espacios hacer un for y meta tantos espacios como es la varible, y al final quitar el tabulador.

Si no se puede hacer así una forma alternativa es por cada vez que lea un tabulador escribir espacio+tabulador. En la última iteración escribes solo espacio o bien después de todas las interaciones sustituyes tabulador por espacio nulo.

Nuse si te servirá así :sifflote:

Entre lo que habia pensado, estaba lo de hacer un for para pasar del numero que tipea el usario a la cantidad de espacios a remplazar en el Tab

me parece que no va a quedar otra que hacerlo asi
Dudo que haya una forma mas simple, o sea alguna funcion que directamente tome el numero y lo transforme en espacios

Saludos!! Gracias

Daggy
12-17-2007, 06:25 PM
Ahí lo tienes, me debes una :P


#!/bin/sh

echo "escriba el nombre del archivo al que le desea aplicar el escript"
read Archivo

#Control para que repita la pregunta si no introduce un número.

while :
do
echo "Indique el numero de espacios con los que remplazara cada Tab"
read Espacio

if [ $Espacio -eq $Espacio 2> /dev/null ]; then
break;
fi
done

#Iniciando las operaciones. El fichero operara en la carpeta /tmp/ y sobreescribirá el fichero original al final.

cp $HOME/$Archivo /tmp/$Archivo"0";

#Por cada iteración escribe una tabulación+espacio por cada tabulación, hasta el número indicado -1.
#Una vez que llega a la iteración número indicado -1 sale del bucle y realiza otra operación sobreescribiendo
#Las tabulaciones restantes por un espacio.

for (( i = 0 ; i < $Espacio-1; i++ ))
do
sed -r 's/\t/\t /' < /tmp/$Archivo"0" > /tmp/$Archivo"2";
cp /tmp/$Archivo"2" /tmp/$Archivo"0";
done

sed -r 's/\t/ /' < /tmp/$Archivo"0" > /tmp/$Archivo"2";

#Sobreescribe el fichero original por el generado y elimina los archivos temporales utilzados.

#cat /tmp/$Archivo"2";
cp /tmp/$Archivo"2" $HOME/$Archivo;
rm -f /tmp/$Archivo*;

hoy tengo la tarde aburrida...

jaja te habia contestado el anterior post y no habia visto este

Muchas gracias

Sos un Groso Sabelo!!!!!

Edit : Te debo el Karma ya que
Necesitas dar reputación a más personas antes de darle reputación a $userinfo[username] de nuevo.
jajaja

arlick
12-17-2007, 06:33 PM
Juaz se me ocurrió una forma más sencilla, que tonto soy >.<

Tal vez sea más eficiente por no tener que estar escribiendo en los ficheros nada más que una vez.

Te creas una varible que contiene tantos espacios como necesitas.

y con una sola línea sustituyes el tabulado por la cadena generada así:


[...]
cadena_generada=" ";
sed -r 's/\t/$cadena_generada' < /tmp/$Archivo"0" > /tmp/$Archivo"2";
[...]


habría que retocarlo un poco, pero eso te lo dejo a tí xD

Daggy
12-17-2007, 06:40 PM
Juaz se me ocurrió una forma más sencilla, que tonto soy >.<

Tal vez sea más eficiente por no tener que estar escribiendo en los ficheros nada más que una vez.

Te creas una varible que contiene tantos espacios como necesitas.

y con una sola línea sustituyes el tabulado por la cadena generada así:


[...]
cadena_generada=" ";
sed -r 's/\t/$cadena_generada' < /tmp/$Archivo"0" > /tmp/$Archivo"2";
[...]

habría que retocarlo un poco, pero eso te lo dejo a tí xD


Si esa esta muy piola
pero no se vale
tengo que tipear si o si un numero X que signifique la cantidad de Espacios
no puedo tipear los espacios directamente

lo que si seria valido creo es generar la cadena con el for
y asi luego si remplezar directamente el archivo, a ver voy a probar

Daggy
12-17-2007, 06:50 PM
algo asi modificando sobre el tuyo y dejando la validacion numerica en el ingreso




#!/bin/sh

echo "escriba el nombre del archivo al que le desea aplicar el escript"
read Archivo

#Control para que repita la pregunta si no introduce un número.

while :
do
echo "Indique el numero de espacios con los que remplazara cada Tab"
read Espacio

if [ $Espacio -eq $Espacio 2> /dev/null ]; then
break;
fi
done

#Iniciando las operaciones. El fichero operara en la carpeta /tmp/ y sobreescribirá el fichero original al final.

cp $HOME/$Archivo /tmp/$Archivo"0";

#Por cada iteración escribe un espacio en la cadena hasta el número indicado -1.
#Una vez que llega a la iteración número indicado -1 sale del bucle y remplaza los archivos

for (( i = 0 ; i < $Espacio-1; i++ ))
do
Cadena = " ";

done

sed -r 's/\t/$Cadena/g' < $HOME/$Archivo >> $HOME/ArchivoTemp


#renombra el fichero generado

mv $HOME/ArchivoTemp $HOME/$Archivo


#elimina los archivos temporales utilzados.


rm -f /tmp/$Archivo*;

arlick
12-17-2007, 08:23 PM
Tal vez funciona como lo pusiste, pero creo que deberías cambiarlo a esto.


#!/bin/sh

echo "escriba el nombre del archivo al que le desea aplicar el escript"
read Archivo

#Control para que repita la pregunta si no introduce un número.

while :
do
echo "Indique el numero de espacios con los que remplazara cada Tab"
read Espacio

if [ $Espacio -eq $Espacio 2> /dev/null ]; then
break;
fi
done

#Iniciando las operaciones. El fichero operara en la carpeta /tmp/ y sobreescribirá el fichero original al final.

cp $HOME/$Archivo /tmp/$Archivo"0";


Espacios="";

for (( i = 0 ; i < $Espacio; i++ ))
do
Espacios=$Espacios" ";

done

sed -r 's/\t/$Espacios/g' < $HOME/$Archivo >> $HOME/ArchivoTemp


#renombra el fichero generado

mv $HOME/ArchivoTemp $HOME/$Archivo


#elimina los archivos temporales utilzados.


rm -f /tmp/$Archivo*;



Así se generan bien los espacios necesarios.

¿Para que sirve la g en sed -r 's/\t/$Espacios/g' ?

TrancoS
12-17-2007, 08:38 PM
Y en español, de que jorca estamos hablando? :sifflote:

Daggy
12-17-2007, 08:46 PM
Tal vez funciona como lo pusiste, pero creo que deberías cambiarlo a esto.


#!/bin/sh




for (( i = 0 ; i < $Espacio; i++ ))
do
Espacios=$Espacios" ";

done

sed -r 's/\t/$Espacios/g' < $HOME/$Archivo >> $HOME/ArchivoTemp



Así se generan bien los espacios necesarios.

¿Para que sirve la g en sed -r 's/\t/$Espacios/g' ?
Si esta bien lo que pones para generar los espacios pero , no estaria pisando la variable que hace de limite al For EDITO: no me di cuenta de la s en espacio por lo tanto no es la misma variable

La g en sed sirve para aplicar la funcion todas las veces que encuentre el parametro en este caso Tab \t
Aproposito lo probe, ambas versiones y me dan este error

25: Syntax error: Bad for loop variable, que es justamente el renglon donde esta declarado el for
???

arlick
12-17-2007, 09:08 PM
Si esta bien lo que pones para generar los espacios pero , no estaria pisando la variable que hace de limite al For EDITO: no me di cuenta de la s en espacio por lo tanto no es la misma variable

La g en sed sirve para aplicar la funcion todas las veces que encuentre el parametro en este caso Tab \t
Aproposito lo probe, ambas versiones y me dan este error

25: Syntax error: Bad for loop variable, que es justamente el renglon donde esta declarado el for
???

nuse, la segunda que te he puesto me funciona bien :S

edit: lo que ocurre con la segunda es que sustituye el tabulado por la cadena $Espacios. Faltaría saber si se puede hacer que use eso como una varible en vez de como texto, pero no idea de como hacerlo.

edit2: lo que le pasa al último que escribiste tu es que está mal declarado para tomar valor_


for (( i = 0 ; i < $Espacio-1; i++ ))
do
Cadena=" ";

done


Sin espacios.

@Trancos: tratamos de pensar en una forma sencilla para dominar el mundo :P

ArcticWolf
12-17-2007, 11:28 PM
Daggy, estás haciendo un curso a distancia o siguiendo un tutorial?