Entfernen von Zeichen am Zeilenende mit find und sed

Entfernen von Zeichen am Zeilenende mit find und sed

Bei einer von Java nach Scala konvertierten Codebasis gibt es viele Dateien mit unnötigen Semikolons am Ende. Hier ist mein Versuch, sie zu entfernen:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done

(Hinweis: Die Verwendung gsedauf dem Mac sedist Müll..)

Dies funktioniert jedoch nicht, da die Semikolons nicht entfernt werden.

Beachten Sie, dass die Ausführung auf einer einzelnen Datei wie folgt erfolgt:

for f in  $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done

tutarbeiten.

Antwort1

Verwenden Sie dies niemals:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Das funktioniertbisSie haben eine Datei, deren Name Leerzeichen oder andere Shell-aktive Zeichen enthält. Zum einen führt die Shell beides ausWorttrennungUndPfadnamenerweiterungauf der Ausgabe von $(find . -name \*.scala). Auch ohne dies wird die Shell ausführenWorttrennung UndPfadnamenerweiterungauf die nicht in Anführungszeichen gesetzten Vorkommen von $fin den Befehlen echound gsed.

In diesem Fall ist es glücklicherweise einfach, Code zu schreiben, der zuverlässig funktioniert: Verwenden Sie einfach -execdie Option von find:

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +

Wenn Sie gleichzeitig die abschließenden Semikolons entfernen möchten, fügen Sie dem sedSkript einfach einen weiteren Ersetzungsbefehl hinzu:

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +

Antwort2

Vielleicht möchten Sie all diese Dinge durchgehen, dos2unixbevor Sie sed ausführen. Wie bekomme ich dos2unix, fragen Sie sich vielleicht? Nun, das ist der Hauptgrund, hier eine weitere Antwort hinzuzufügen (und weil ich noch nicht genug Reputation habe, um Kommentare hinzuzufügen). Wenn Sie OSX überleben wollen, brauchen Sie dieHomebrew-Paketmanager. Das erste, was Sie nach der Installation von Homebrew (2 Minuten) tun müssenAktualisieren Sie die Bash!! OSX hat Bash seit Jahren nicht aktualisiert. Damit können Sie die Unix-Dienstprogramme aktualisieren.

Falls Sie in der Vergangenheit schlechte Erfahrungen mit MacPorts und Fink gemacht haben: Homebrew ist nicht so. Wirklich. OSX ohne Homebrew ist wie Windows ohne Cygwin. Naja, nicht wirklich, aber Sie verstehen, was ich meine.

Antwort3

Ich habe den Grund gefunden: Die Dateien enthielten ^M(DOS-Stil CRLF) - also musste ich zuerst Folgendes tun:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Anschließend funktioniert der im OP angezeigte Befehl einwandfrei.

verwandte Informationen