Entfernen Sie nachgestellte Leerzeichen aus Dateien


10

Die Antwort auf das Entfernen von Leerzeichen mit sed hat die meiste Antwort, aber ich möchte

sed -i 's/[ \t]*$//' $1

um eine beliebige Anzahl von Dateiargumenten als Shell-Skript in der Befehlszeile verwenden zu können, einschließlich globaler Argumente. Angenommen, das Skript wird aufgerufen strip_trailing_whitespace. Dann möchte ich beides können

strip_trailing_whitespace foo.cc bar.cc

und

strip_trailing_whitespace *.cc *.hh

um nachfolgende Leerzeichen aus allen Dateien des Formulars zu entfernen *.ccund *.hh. Argumente, die nicht auf der oben zitierten Antwort basieren, sind ebenfalls in Ordnung.

Antworten:


13

$1ist ein Positionsparameter ; Es wird auf das erste Argument erweitert, das an das Skript übergeben wird. Es gibt in ähnlicher Weise $2, $3... $9, ${10}, ${11}, ...

Der spezielle Parameter "$@" wird zu einer Liste aller Positionsparameter erweitert.

Sie können also Folgendes tun:

sed -i 's/[ \t]*$//' "$@"

Wenn Sie diesem Skript (oder einem beliebigen Programm) einen Glob / Pattern übergeben möchten, muss dieser beim Aufrufen des Skripts maskiert oder in Anführungszeichen gesetzt werden. Dies ist eine Funktion der Shell. Es werden alle Muster erweitert, bevor Ihr Skript sie überhaupt sieht. Dieser Fall sollte das nicht benötigen - die Shell kann das Muster erweitern, und die Ergebnisse dieser Erweiterung werden alle an übergeben sed.


Genau so : echo "$@". Wenn Sie den Parameter verwenden, wird er in keiner Weise geändert, sodass Sie $@beliebig oft (oder auf einen anderen Parameter: positionell, speziell oder nicht) verweisen können .
Shawn J. Goff

Ja, das habe ich nach dem Posten bemerkt, war aber anscheinend zu langsam, um die Frage zu entfernen. :-)
Faheem Mitha

Denken Sie -i.bakauch daran ... ganz zu schweigen davon, dass ich manchmal auf eine Variante von sedohne -istoße :) ... +1, immer noch.
0xC0000022L

Das funktioniert nicht mit der Version der Arbeit , seddass Schiffe mit OS X. Installieren Sie stattdessen gnu-sed( brew install gnu-sed) und ersetzt sedmit gsedin dem Befehl.
Robert Audi

8

Ich finde es einfach, sed mit xargs wie folgt zu verwenden:

find . -name "*.xml" | xargs sed -i 's/[ \t]*$//'

find . -type f | grep cc | xargs sed -i 's/[ \t]*$//'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.