loop for não funciona no bash

7

Eu tenho o código abaixo para substituir algumas strigns em vários arquivos, mas o loop for está verificando o primeiro arquivo e não executando o script perl. abaixo está o meu 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
sudhir prabhu
fonte
2
Remova o $(...)padrão globbing do seu nome de arquivo. Você não precisa de uma substituição de comando lá. Você também pode combinar as quatro invocações Perl em uma única para obter velocidade.
Kusalananda

Respostas:

9

A $(foo)construção executará o comando fooe será substituída $(foo)pela saída de execução foo. Você quer um globo, isso não é um comando. O que você está fazendo é tentar executar todos os arquivos chamados ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*. Tudo o que você precisa é:

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

Ou, mais simplesmente:

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

Ou ainda mais simplesmente:

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
terdon
fonte
3
O loop é necessário? Pode perl -iptrabalhar em vários arquivos ao mesmo tempo? Eu nunca testei isso.
Kusalananda
@Kusalananda realmente pode. Deveria ter pensado nisso, obrigado!
terdon