Ich bin ein Java-Entwickler und verwende Ubuntu zum Entwickeln. Das Projekt wurde in Windows mit Eclipse erstellt und verwendet die Windows-1252- Codierung.
Um auf UTF-8 zu konvertieren, habe ich das Rekodierungsprogramm verwendet :
find Web -iname \*.java | xargs recode CP1252...UTF-8
Dieser Befehl gibt diesen Fehler aus:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data
Ich habe danach gesucht und die Lösung in Bash und Windows erhalten. Recode: Mehrdeutige Ausgabe in Schritt `data..CR-LF ' und es heißt:
Konvertieren Sie Zeilenenden von CR / LF in eine einzelne LF: Bearbeiten Sie die Datei mit Vim, geben Sie den Befehl ein
:set ff=unix
und speichern Sie die Datei. Recode sollte jetzt fehlerfrei ausgeführt werden.
Schön, aber ich habe viele Dateien, aus denen das CR / LF-Zeichen entfernt werden kann, und ich kann nicht jede öffnen, um dies zu tun. Vi bietet keine Befehlszeilenoption für Bash-Operationen.
Kann sed dazu verwendet werden? Wie?
quelle
recode
Dieser Fehler tritt auf, wenn versucht wird, eine Datei mit gemischter Zeilenumbruchcodierung (\r\n
- CRLF) und Unix (\n
LF) neu zu codieren. Leiderfromdos
ist früher eine Binärdatei ein Alias zum Neukodieren, bei dem dieses Problem auftritt.vim +ex_command_one +ex_command_two ... file
awk
Antworten enthalten keine Lösung.Antworten:
Es sollte ein Programm namens geben
dos2unix
, das Zeilenenden für Sie repariert. Wenn es nicht bereits auf Ihrer Linux-Box vorhanden ist, sollte es über den Paketmanager verfügbar sein.quelle
fromdos
ist nur ein Alias fürrecode
, und das erzeugt den Fehler OP, der für Dateien mit gemischter Dosierung (\ r \ n - CRLF) und Unix (\ n LF) erwähnt wird. Funktioniert nurdos2unix
universell.find ./ -name "*.java" -exec dos2unix {} +
.sed kann nicht mit \ n übereinstimmen, da die nachfolgende neue Zeile entfernt wird, bevor die Zeile in den Musterbereich eingefügt wird. Sie kann jedoch mit \ r übereinstimmen, sodass Sie \ r \ n (dos) in \ n (unix) konvertieren können, indem Sie \ r entfernen
Warnung: Dadurch wird die Originaldatei geändert
Sie können jedoch nicht von Unix EOL zu Dos oder Old Mac (\ r) wechseln. Weitere Lesungen hier:
Wie kann ich eine neue Zeile (\ n) mit sed ersetzen?
quelle
sed -i
die Originaldatei geändert wird ! Weil die Leute nicht erwarten würdensed
, sich so zu verhalten, ist hier eine Warnung angebracht. Nicht viele Leute wissen es,-i
also werden sie versuchensed -i ... file > file2
und nicht erwarten, dass die Originaldatei geändert wird.sed
Varianten erkennen die nicht standardmäßige symbolische Sequenz\r
. Versuchen Sie es in diesem Fall mit einem wörtlichen Strg-M-Zeichen (geben Sie in vielen Shells Strg-V Strg-M ein, um das wörtliche Steuerzeichen zu erzeugen).Tatsächlich erlaubt vim, wonach Sie suchen. Geben Sie vim ein und geben Sie die folgenden Befehle ein:
Der erste dieser Befehle setzt die Argumentliste
**/*.java
rekursiv auf jede übereinstimmende Datei , bei der es sich ausschließlich um Java-Dateien handelt. Der zweite dieser Befehle führt nacheinander für jede Datei in der Argumentliste Folgendes aus:quelle
dos2unix
in einer for-Schleife, aber es ist immer noch schön zu wissen, wie es in Vim gemacht wird!Der Befehl tr kann auch Folgendes tun:
und sollte Ihnen zur Verfügung stehen.
Sie müssen tr in einem Skript ausführen, da es nicht mit Dateinamen funktionieren kann. Erstellen Sie beispielsweise eine Datei myscript.sh:
Beim Ausführen
myscript.sh
werden alle Java-Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen verarbeitet.quelle
Ich werde eine kleine Ausnahme von Jichaos Antwort machen. Sie können tatsächlich alles, worüber er gerade gesprochen hat, ziemlich einfach tun. Anstatt nach einem zu
\n
suchen, suchen Sie einfach am Ende der Zeile nach Wagenrücklauf.Um von Unix zurück zu dos zu wechseln, suchen Sie einfach nach dem letzten Zeichen in der Zeile und fügen Sie einen Formular-Feed hinzu. (Ich werde hinzufügen
-r
, um dies mit regulären grep-Ausdrücken zu vereinfachen.)Theoretisch könnte die Datei in einen Mac-Stil geändert werden, indem dem letzten Beispiel Code hinzugefügt wird, der auch die nächste Eingabezeile an die erste Zeile anfügt, bis alle Zeilen verarbeitet wurden. Ich werde jedoch nicht versuchen, dieses Beispiel hier zu machen.
Warnung: -i ändert die aktuelle Datei. Wenn Sie eine Sicherung erstellen möchten, fügen Sie anschließend eine Zeichenfolge hinzu
-i
. Dadurch wird die vorhandene Datei in eine Datei mit demselben Namen verschoben, wobei Ihre Zeichen am Ende hinzugefügt werden.quelle
sed -i 's/$/\r/' ${FILE_NAME}
...-r
Option ist nicht portabel. Wenn Siesed
es nicht haben, versuchen Sie es vielleicht-E
.Um zu überwinden
Eine einfache Lösung könnte darin bestehen, ein
-f
Flag hinzuzufügen , um die Konvertierung zu erzwingen.quelle
Haben Sie das hier gefundene Python-Skript von Bryan Maupin ausprobiert ? (Ich habe es ein wenig modifiziert, um allgemeiner zu sein)
Sie können dieses Skript mit verwenden
quelle
Gehen Sie zurück zu Windows, weisen Sie Eclipse an, die Codierung in UTF-8 zu ändern, dann zurück zu Unix und führen Sie
d2u
die Dateien aus.quelle
fromdos
in 10.04 aufrufen und es ist Teil des Paketstofrodos
.