Ich habe ein Bash-Skript, das alle * .php-Dateien in einem Verzeichnis auflistet und iconv
auf sie anwendet . Dies wird in STDOUT ausgegeben.
Da das Hinzufügen des -o
Parameters (meiner Erfahrung nach) wahrscheinlich vor der Konvertierung tatsächlich eine leere Datei schreibt, wie kann ich mein Skript so anpassen, dass es die Konvertierung durchführt, und dann die Eingabedatei überschreiben?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
meder omuraliev
quelle
quelle
Antworten:
Dies funktioniert nicht, da
iconv
zuerst die Ausgabedatei erstellt (da die Datei bereits vorhanden ist, wird sie abgeschnitten) und dann mit dem Lesen der Eingabedatei begonnen wird (die jetzt leer ist). Die meisten Programme verhalten sich so.Erstellen Sie eine neue temporäre Datei für die Ausgabe, und verschieben Sie sie an ihren Platz.
Wenn Ihre Plattform
iconv
keine hat-o
, können Sie eine Shell-Umleitung verwenden, um den gleichen Effekt zu erzielen.Colin Watsons
sponge
Utility (in Joey Hess 'moreutils enthalten ) automatisiert dies:Diese Antwort gilt nicht nur für
iconv
Filterprogramme , sondern für alle Filterprogramme. Einige Sonderfälle sind erwähnenswert:-p
haben die-i
Option, vorhandene Dateien zu ersetzen.grep
,tr
,sed 's/long input text/shorter text/'
), und man mag gefährlich leben, können Sie wirklich wollen, um die Datei an Ort und Stelle ändern (die anderen Lösungen erwähnten hier erstellen neue Ausgabedatei und verschieben Sie sie an ihren Platz am Ende, damit die ursprünglichen Daten unverändert bleiben, wenn der Befehl aus irgendeinem Grund unterbrochen wird.quelle
sponge
ausschließlich Joey Hess zugeschrieben werden sollte; es ist das Paketmoreutils
,sponge
das er pflegt, aber in Bezug auf die Herkunftsponge
, indem er den Links von der Homepage von folgtmoreutils
, habe ich festgestellt, dass es ursprünglich von Colin Watson gepostet und zur Aufnahme vorgeschlagen wurde : "Joey schreibt über das Fehlen neuer Werkzeuge, die passen in die Unix-Philosophie. Mein Favorit von solchen Dingen, die ich geschrieben habe, istsponge
"(Mo, 06.02.2006).iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, sind in Bezug auf-o
Parameter ziemlich schlau. Wenn sie feststellen, dass die Ausgabedatei mit der Eingabe identisch ist, verwalten sie intern eine temporäre Datei, damit sie einfach funktioniert.Eine Alternative ist
recode
, die für einige Konvertierungen die Bibliothek libiconv verwendet. Sein Verhalten besteht darin, die Eingabedatei durch die Ausgabe zu ersetzen, sodass dies funktioniert:Da
recode
mehrere Eingabedateien als Parameter akzeptiert werden, können Sie diefor
Schleife schonen :quelle
info recode
stattdessen. Ist ausführlicher.Zur Zeit
klappt wunderbar
quelle
Sie können Vim im Ex-Modus verwenden:
%
Wählen Sie alle Zeilen aus!
Führen Sie den Befehl ausx
speichern und schließenquelle
Hier ist ein einfaches Beispiel . Es sollte Ihnen genügend Informationen geben, um loszulegen.
quelle
funktioniert bei mir
quelle
Du kannst find verwenden, zumindest funktionierte dies für mich auf Raspbian Stretch:
quelle
Eine Möglichkeit besteht darin,
perl
die Benutzeroberflächeiconv
und den-i
Modus für die direkte Bearbeitung zu verwenden:Mit GNU
awk
können Sie auch Folgendes tun:Die
ksh93
Shell hat auch einen>;
Operator, der die Ausgabe in einer temporären Datei speichert, die bei erfolgreichem Befehl in die umgeleitete Datei umbenannt wird:quelle