für Schleife funktioniert nicht in Bash


7

Ich habe den folgenden Code, um einige Strigns in mehreren Dateien zu ersetzen, aber die for-Schleife sucht nach der ersten Datei und führt das Perl-Skript nicht aus. Unten ist mein Code

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
Entfernen Sie das $(...)Globbing-Muster um Ihren Dateinamen. Sie brauchen dort keine Befehlsersetzung. Sie können die vier Perl-Aufrufe aus Geschwindigkeitsgründen auch zu einem einzigen kombinieren.
Kusalananda

Antworten:


9

Das $(foo)Konstrukt führt den Befehl aus foound ersetzt ihn $(foo)durch die Ausgabe von running foo. Du willst einen Glob, das ist kein Befehl. Sie versuchen, alle aufgerufenen Dateien auszuführen ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*. Alles was Sie brauchen ist:

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

Oder einfacher:

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

Oder noch einfacher:

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
Wird die Schleife überhaupt benötigt? Kann perl -ipan mehreren Dateien gleichzeitig arbeiten? Ich habe taht noch nie getestet.
Kusalananda

@Kusalananda in der Tat kann es. Hätte daran denken sollen, danke!
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.