para el bucle no funciona en bash


7

Tengo el siguiente código para reemplazar algunas cadenas en varios archivos, pero el bucle for está buscando el primer archivo y no está ejecutando el script perl. a continuación está mi código

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in $(./zebu.work.post_opt/ZEBU_CTO_FT_MOD*);
    do
    perl -i -p -e 's/input/inout/g' $file; 
        perl -i -p -e 's/output/inout/g' $file;
        perl -i -p -e 's/wire.*\n/tran\(i0,\ o\);/g' $file;
        perl -i -p -e 's/assign.*\n//g' $file;
    done
fi

2
Elimine el $(...)patrón de globo alrededor de su nombre de archivo. No necesita una sustitución de comando allí. También puede combinar las cuatro invocaciones de Perl en una sola para obtener velocidad.
Kusalananda

Respuestas:


9

La $(foo)construcción ejecutará el comando fooy lo reemplazará $(foo)con la salida de ejecución foo. Quieres un pegote, eso no es un comando. Lo que estás haciendo es intentar ejecutar todos los archivos llamados ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*. Todo lo que necesitas es:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*;
    do
        perl -i -p -e 's/input/inout/g' "$file"
        perl -i -p -e 's/output/inout/g' "$file"
        perl -i -p -e 's/wire.*\n/tran\(i0,\ o\);/g' "$file"
        perl -i -p -e 's/assign.*\n//g' "$file"
    done
fi

O, más simplemente:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*;
    do
        perl -i -p -e 's/input/inout/g; s/output/inout/g; 
                       s/wire.*\n/tran\(i0,\ o\);/g; 
                       s/assign.*\n//g' "$file"
    done
fi

O incluso más simplemente:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    perl -i -p -e 's/input/inout/g; s/output/inout/g; 
                   s/wire.*\n/tran\(i0,\ o\);/g; 
                   s/assign.*\n//g' ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*
fi

3
¿Se necesita el bucle? ¿Puede perl -iptrabajar en varios archivos a la vez? Nunca he probado taht.
Kusalananda

@Kusalananda de hecho puede. Debería haber pensado en eso, gracias!
terdon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.