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.

Faheem Mitha
quelle

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.

Shawn J. Goff
quelle
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]*$//'

Pannag R Sanketi
quelle