Zeilenende und Kodierung der Datei gleichzeitig ändern

571
George Simms

Ich habe einige Dateien mit Windows-Zeilenenden und latin-1-Codierung, die ich in Unix-Zeilenenden und utf-8 konvertieren muss.

Natürlich kann ich

for file in ./*.csv; do sed s'/^M//' "$file" > "$.bak" iconv -f iso-8859-1 -t utf8 "$.bak" > "$file" rm "$.bak" done 

Aber gibt es ein allgemein verfügbares Werkzeug, das beides gleichzeitig erledigen kann? Vielleicht ist dies nicht der effizienteste Weg. (Vielleicht iconv?)

0
Ich bin der festen Überzeugung, dass die Antwort "nein" ist, da diese beiden Aufgaben sehr unterschiedlich sind und es nicht sinnvoll ist, ein einziges Werkzeug zu schreiben, um beide Aufgaben gleichzeitig auszuführen, insbesondere wenn es um die Unix-Philosophie geht. Aber hey, wer weiß, wann jemand verrückt ist ... Abel Cheung vor 8 Jahren 1

1 Antwort auf die Frage

0
fd0

Ich würde einige kleine Änderungen an Ihrem Skript vornehmen. Verwenden lsSie sie nicht zuerst in Ihrer forSchleife, sondern verwenden Sie sie, *.csvweil der Glob nicht druckbare Zeichen und Leerzeichen in Dateinamen verarbeitet. Anstelle von seds Inplace-Weiterleitung zu $file.bak. Wenn stringsauf Ihrem System verfügbar ist, ersetzen Sie es sedmit strings. Denken Sie immer daran, Variablen zu zitieren.

 for file in *.csv do sed 's/^M//' "$file" > "$.bak" #strings "$file" > "$.bak" iconv -f -iso-8859-1 -t utf8 "$.bak" > "$file" rm "$.bak" done  
Danke, ich werde die Frage entsprechend aktualisieren, aber das beantwortet die Frage nicht wirklich. Dies ist auch eine etwas weniger explizite Methode zum Konvertieren von Zeilenenden, und ein Leser könnte über die Motivation für die Zeile verwirrt sein. Funktioniert dies, wenn die Datei walisische Buchstaben wie w circumflex enthält? George Simms vor 8 Jahren 0
Nun, ein Werkzeug ist möglicherweise nicht so effizient wie zwei oder mehr Werkzeuge. Meine Antwort zielte darauf ab, Ihren Code effizienter zu machen. Der Glob sollte viel schneller sein als 'ls'. "Strings" ändern Wagenrücklauf und Wagenrücklauf / Zeilenumbrüche blind in Zeilenumbrüche. "strings" sollte schneller sein und wenn mir bewusst wäre, dass die letzte Zeile der csv-Datei beendet wurde, würde ich vorschlagen, "tr" anstelle von "strings" zu verwenden .iconv ist das einzige Werkzeug, das ich für Ihren Zweck kenne. fd0 vor 8 Jahren 0