Übergeben des Platzhalters * an ein (Bash?)-Skript

Übergeben des Platzhalters * an ein (Bash?)-Skript

Ich möchte alle Farbcodes, die wie „@n“, „@R“ usw. aussehen, aus einer mittelgroßen Sammlung von Textdateien entfernen.

Also habe ich in eine Datei namens „remove_cc“ Folgendes geschrieben:

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

Wie auch immer, das Skript funktioniert fantastisch, wenn ich es wie folgt verwende: ./remove_cc file.txt

Wenn ich aber ./remove_cc *.txteinen Ordner mit vielen TXT-Dateien eingebe, für die ich das Skript ausführen möchte, passiert nichts. ./remove_cc *ist ebenso wirkungslos.

Gibt es eine Möglichkeit, dies zu beheben, damit es funktioniert?

Antwort1

Wenn Sie eingeben ./remove_cc *, ändert die Shell es in ./remove_cc file1.txt file2.txt file3.txt etcund führt Ihr Skript auf diese Weise aus. Ihr Skript betrachtet nur $1, den ersten Parameter (file1.txt).

Die allgemeinste Möglichkeit hierfür besteht darin, nacheinander alle Parameter zu durchlaufen. "$@"wird zur Liste aller Parameter erweitert, und wir können fordiese zum Durchlaufen verwenden.

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

Da in diesem speziellen Fall sedmehrere Dateinamen benötigt werden, können Sie es wie folgt vereinfachen:

sed -ie 's/@r//g' "$@"

Beachten Sie, dass beim Schreiben von Shell-Skripten auf Anführungszeichen geachtet werden muss. Ohne die Anführungszeichen würde das Skript beispielsweise bei einer Datei mit dem Namen nicht funktionieren My Text File.txt.

Antwort2

benutz einfach

 for x in *
 do
     ./remove_cc $x
 done

Übrigens können Sie alle sed in einer Zeile zusammenfassen

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

Sie können sed-Befehle auch mit Semikolons verbinden:

sed -i -e 's/@r//g;s/@g//g;s/@y//g' $1

oder verwenden Sie einfach die Zeichenliste

sed -i -e s/@[rgbcmyRGBCMY]//g $1

oder

 sed -i -e s/@[rgbcmyRGBCMY]//g *

(überprüfen Sie unbedingt, ob ich alle Buchstaben eingegeben habe)

Antwort3

Verwenden Sie "$@"anstelle von $1. Oder zitieren Sie das Platzhalterzeichen:

$ bash -c 'echo $1' 'some command' '*'
file1 file2
$ bash -c 'echo "$@"' 'some command' *
file1 file2

Antwort4

Wenn Sie Ihr Skript nicht ändern möchten, können Sie auch xargs verwenden (vorausgesetzt, Sie haben es oder es ist auf Ihrer Plattform verfügbar), indem Sie es wie folgt ausführen:

ls *.txt | xargs -L1 ./remove_cc

xargs ist ein Dienstprogramm, das stdin verwendet und in Befehlsparameter für einen auszuführenden Befehl umwandelt. Es verfügt über das Flag -L, das die Anzahl der Eingabezeilen begrenzt, die bei einer einzelnen Ausführung verwendet werden können.

verwandte Informationen