
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 gsed
auf dem Mac sed
ist 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 $f
in den Befehlen echo
und gsed
.
In diesem Fall ist es glücklicherweise einfach, Code zu schreiben, der zuverlässig funktioniert: Verwenden Sie einfach -exec
die 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 sed
Skript 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, dos2unix
bevor 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.