forループがbashで機能しない


7

複数のファイルの一部のstrignを置き換える以下のコードがありますが、forループは最初のファイルをチェックしており、perlスクリプトを実行していません。以下は私のコードです

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
$(...)ファイル名の周囲のグロビングパターンを削除します。そこではコマンド置換は必要ありません。速度を上げるために、4つのPerl呼び出しを1つに組み合わせることもできます。
Kusalananda

回答:


9

$(foo)構築物は、コマンドを実行しますfooと置き換える$(foo)ランニングの出力とfoo。コマンドではないグロブが必要です。あなたがしていることはと呼ばれるすべてのファイルを実行しようとすることです./zebu.work.post_opt/ZEBU_CTO_FT_MOD*。あなたに必要なのは:

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

または、もっと簡単に:

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

またはもっと簡単に:

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
ループも必要ですか?perl -ip一度に複数のファイルで作業できますか?私はテストしたことがありません。
Kusalananda

@Kusalananda確かにできます。それを考えるべきだった、ありがとう!
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.