%20.png)
Quiero eliminar todos los códigos de color que parecen '@n', '@R', etc., de una colección de archivos de texto de tamaño moderadamente grande.
Entonces, en un archivo llamado 'remove_cc', escribí lo siguiente:
sed -ie 's/@r//g' $1
sed -ie 's/@g//g' $1
sed -ie 's/@y//g' $1
sed -ie 's/@b//g' $1
sed -ie 's/@m//g' $1
sed -ie 's/@c//g' $1
sed -ie 's/@n//g' $1
sed -ie 's/@R//g' $1
sed -ie 's/@G//g' $1
sed -ie 's/@Y//g' $1
sed -ie 's/@B//g' $1
sed -ie 's/@M//g' $1
sed -ie 's/@C//g' $1
sed -ie 's/@N//g' $1
sed -ie 's/@W//g' $1
sed -ie 's/@K//g' $1
De todos modos, el script funciona fantásticamente si lo uso como: ./remove_cc file.txt
Pero si escribo ./remove_cc *.txt
una carpeta con muchos archivos de texto en los que quiero ejecutar el script, no hace nada. ./remove_cc *
es igualmente ineficaz.
¿Hay alguna manera de solucionar esto para que funcione?
Respuesta1
Cuando escribe ./remove_cc *
, el shell lo cambia a ./remove_cc file1.txt file2.txt file3.txt etc
y ejecuta el script de esa manera. Su secuencia de comandos solo mira $1
el primer parámetro (archivo1.txt).
La forma más general de hacer esto es recorrer cada parámetro por turno. "$@"
se expande a la lista de todos los parámetros, y podemos usar for
para recorrerlos.
for n in "$@" ; do
sed -ie 's/@r//g' "$n"
...
done
En este caso particular, dado que sed
se necesitarán varios nombres de archivo, puedes simplificar:
sed -ie 's/@r//g' "$@"
Tenga en cuenta que es importante prestar atención a las comillas al escribir scripts de shell. Sin las comillas, por ejemplo, el script no funcionaría en un archivo llamado My Text File.txt
.
Respuesta2
Solo usa
for x in *
do
./remove_cc $x
done
Por cierto, puedes combinar todos los sed en una línea.
sed -i \
-e 's/@r//g' -e 's/@g//g' -e 's/@y//g' -e 's/@b//g' \
-e 's/@m//g' -e 's/@c//g' -e 's/@n//g' -e 's/@R//g' \
-e 's/@G//g' -e 's/@Y//g' -e 's/@B//g' -e 's/@M//g' \
-e 's/@C//g' -e 's/@N//g' -e 's/@W//g' -e 's/@K//g' \
$1
También puedes unir comandos sed con punto y coma:
sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1
o simplemente usar la lista de personajes
sed -i -e s/@[rgbcmyRGBCMY]//g $1
o
sed -i -e s/@[rgbcmyRGBCMY]//g *
(asegúrate de comprobar que he puesto toda la letra)
Respuesta3
Usar "$@"
en lugar de $1
. O cite el comodín:
$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2
Respuesta4
Si no desea cambiar su script, también puede usar xargs (considerando que lo tiene o está disponible en su plataforma) ejecutándolo así:
ls *.txt | xargs -L1 ./remove_cc
xargs es una utilidad que toma stdin y la transforma en parámetros de comando en un comando que se ejecutará. Tiene el indicador -L que limita la cantidad de líneas de entrada que se utilizarán en una sola ejecución.