Pasar el comodín * a un script (¿bash?)

Pasar el comodín * a un script (¿bash?)

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 *.txtuna 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 etcy ejecuta el script de esa manera. Su secuencia de comandos solo mira $1el 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 forpara recorrerlos.

for n in "$@" ; do
    sed -ie 's/@r//g' "$n"
    ...
done

En este caso particular, dado que sedse 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.

información relacionada