-Skript%20.png)
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 *.txt
einen 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 etc
und 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 for
diese zum Durchlaufen verwenden.
for n in "$@" ; do
sed -ie 's/@r//g' "$n"
...
done
Da in diesem speziellen Fall sed
mehrere 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.