Wie können Sie alle nachgestellten Leerzeichen eines gesamten Projekts entfernen? Beginnen Sie in einem Stammverzeichnis und entfernen Sie das nachfolgende Leerzeichen aus allen Dateien in allen Ordnern.
Außerdem möchte ich in der Lage sein, die Datei direkt zu ändern und nicht nur alles auf stdout zu drucken.
bash
whitespace
iamjwc
quelle
quelle
Antworten:
Hier ist eine OS X> = 10.6 Snow Leopard-Lösung.
Es ignoriert die Ordner .git und .svn und deren Inhalt. Außerdem wird keine Sicherungsdatei hinterlassen.
quelle
\+
anstelle*
der Ersatzzeichenfolge verwenden. Andernfalls stimmt es in jeder einzelnen Zeile überein.sed: RE error: illegal byte sequence
für mich zurück.export LANG=C
und versuchen Sie es erneutexport LC_CTYPE=C
wie hier zu finden: stackoverflow.com/questions/19242275/…Verwenden:
Wenn Sie nicht möchten, dass die ".bak" -Dateien generiert werden:
Als zsh-Benutzer können Sie den Aufruf zum Suchen weglassen und stattdessen Folgendes verwenden:
Hinweis: Um zu verhindern, dass das
.git
Verzeichnis zerstört wird , fügen Sie Folgendes hinzu :-not -iwholename '*.git*'
.quelle
.git
Verzeichnissen, egal wie tief verschachtelt.find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
rsync -rv --exclude=.git repo/ repo2/
die lokalen Änderungen inrepo
(unbeschädigt) vorgenommen haberepo2
.Zwei alternative Ansätze, die auch mit DOS-Zeilenumbrüchen (CR / LF) funktionieren und bei der Vermeidung von Binärdateien ziemlich gute Arbeit leisten :
Generische Lösung, die überprüft, ob der MIME-Typ beginnt mit
text/
:Git-Repository-spezifische Lösung von Mat, die die
-I
Option verwendetgit grep
, Dateien zu überspringen, die Git als binär betrachtet:quelle
sed
der Suffix Option-i
ist optional , aber in BSDsed
ist es nicht. Es ist hier streng genommen sowieso nicht notwendig, also werde ich es einfach entfernen.In Bash:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
Hinweis: Wenn Sie ein
.git
Repository verwenden, fügen Sie Folgendes hinzu :-not -iwholename '.git'
.quelle
Dies funktionierte für mich in OSX 10.5 Leopard, das weder GNU sed noch xargs verwendet.
Seien Sie vorsichtig, wenn Sie Dateien haben, die ausgeschlossen werden müssen (ich habe es getan)!
Mit -prune können Sie bestimmte Verzeichnisse oder Dateien ignorieren. Für Python-Dateien in einem Git-Repository können Sie Folgendes verwenden:
quelle
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
. Ersetzen Siedir
durch das betreffende Verzeichnis als oberste Ebene, aus der Sie zurückkehren können.sed -i .bak
? Sollte es nicht seinsed -i.bak
(ohne Platz)?Ack wurde für diese Art von Aufgabe gemacht.
Es funktioniert genau wie grep, kann aber nicht in Orte wie .svn, .git, .cvs usw. absteigen.
Viel einfacher als mit find / grep durch Reifen zu springen.
Ack ist über die meisten Paketmanager verfügbar (entweder als ack oder ack-grep ).
Es ist nur ein Perl-Programm, daher ist es auch in einer Einzeldateiversion verfügbar, die Sie einfach herunterladen und ausführen können. Siehe: Installation bestätigen
quelle
ack
ist wunderbar. Ich benutze es seit einigen Jahren und bin in fast allen Paket-Repos für die meisten Distributionen erhältlich.ex
Versuchen Sie es mit dem Ex-Editor (Teil von Vim):
Hinweis: Für die Rekursion (bash4 & zsh) verwenden wir eine neue Globbing-Option (
**/*.*
). Aktivieren durchshopt -s globstar
.Sie können Ihrer Funktion folgende Funktion hinzufügen
.bash_profile
:sed
Aktivieren Sie zur Verwendung
sed
Folgendes: Entfernen von nachgestellten Leerzeichen mit sed?find
Suchen Sie das folgende Skript (z. B.
remove_trail_spaces.sh
) zum Entfernen nachfolgender Leerzeichen aus den Dateien:Führen Sie dieses Skript in dem Verzeichnis aus, das Sie scannen möchten. Unter OSX werden am Ende alle Dateien entfernt, die mit enden
.bak
.Oder nur:
Dies wird übrigens von Spring Framework Code Style empfohlen .
quelle
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
entfernt nur ein nachfolgendes Leerzeichen anstelle von allen.Am Ende habe ich find nicht verwendet und keine Sicherungsdateien erstellt.
Abhängig von der Tiefe des Dateibaums kann diese (kürzere Version) für Ihre Anforderungen ausreichend sein.
HINWEIS Hierfür werden beispielsweise auch Binärdateien verwendet.
quelle
Anstatt Dateien auszuschließen, finden Sie hier eine Variation der oben genannten explizit weißen Listen der Dateien, basierend auf der Dateierweiterung, die Sie entfernen möchten. Sie können sie nach Belieben würzen:
quelle
-name "*.rb*"
Am Ende habe ich dies ausgeführt, was eine Mischung aus Pojo und Adams Version ist.
Es werden sowohl nachgestellte Leerzeichen als auch eine andere Form von nachgestellten Leerzeichen, der Wagenrücklauf, bereinigt:
Der .git-Ordner wird nicht berührt, wenn es einen gibt.
Bearbeiten : Nach dem Kommentar etwas sicherer gemacht, da keine Dateien mit ".git" oder ".svn" aufgenommen werden dürfen. Aber Vorsicht, es wird Binärdateien berühren, wenn Sie welche haben. Verwenden Sie
-iname "*.py" -or -iname "*.php"
nach,-type f
wenn Sie nur z. B. .py- und .php-Dateien berühren möchten.Update 2 : Es ersetzt jetzt alle Arten von Leerzeichen am Zeilenende (dh auch Tabulatoren).
quelle
Dies funktioniert gut. Hinzufügen / Entfernen - Einschließen für bestimmte Dateitypen:
quelle
Rubin:
quelle
Ich benutze reguläre Ausdrücke. 4 Schritte:
Dadurch werden alle nachgestellten Leerzeichen am Ende jeder Zeile in allen Dateien entfernt. Und Sie können einige Dateien ausschließen, die nicht zu diesem Bedarf passen.
quelle
1) Viele andere Antworten verwenden
-E
. Ich bin mir nicht sicher warum, da dies eine undokumentierte BSD-Kompatibilitätsoption ist .-r
sollte stattdessen verwendet werden.2) Andere Antworten verwenden
-i ''
. Das sollte gerecht sein-i
(oder-i''
wenn bevorzugt), weil-i
das Suffix direkt danach steht.3) Git-spezifische Lösung:
Der erste registriert einen Git-Alias,
check-whitespace
der die Dateien mit nachgestellten Leerzeichen auflistet. Der zweite läuftsed
auf ihnen.Ich verwende nur vertikale Tabulatoren, Formular-Feeds und nicht unterbrechbare Leerzeichen,
\t
anstatt sie[:space:]
normalerweise nicht zu sehen. Ihre Messung kann variieren.quelle
Dies funktioniert bei mir (Mac OS X 10.8, GNU sed von Homebrew installiert):
Nachgestellte Leerzeichen entfernt, Tabulatoren durch Leerzeichen ersetzt, Windows CRLF durch Unix ersetzen
\n
.Interessant ist, dass ich dies 3-4 Mal ausführen muss, bevor alle Dateien durch alle Reinigungsanweisungen
gsed
repariert werden.quelle