Ich habe ein einfaches Shell-Skript, das nachgestellte Leerzeichen aus einer Datei entfernt. Gibt es eine Möglichkeit, dieses Skript kompakter zu gestalten (ohne eine temporäre Datei zu erstellen)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
quelle
quelle
mv
anstelle voncat
und verwendenrm
. Warum benutzt du das überhauptcat
so? Warum nicht verwendencp
?cat
zum Überschreiben der Originaldateimv
die Daten in der Originaldatei ersetzt, anstatt sie tatsächlich zu ersetzen (dh, es werden keine festen Links unterbrochen). Die Verwendung,sed -i
wie in vielen Lösungen vorgeschlagen, reicht nicht aus. IOW, mach einfach weiter, was du tust.Antworten:
Sie können die anstelle Option
-i
vonsed
für Linux und Unix:Beachten Sie, dass der Ausdruck unter
t
OSX nachgestellte Zeichen löscht (Sie könnengsed
dieses Problem vermeiden). Es kann sie auch auf BSD löschen.Wenn Sie nicht gsed haben, finden Sie hier die korrekte (aber schwer zu lesende) sed-Syntax unter OSX:
Drei Zeichenfolgen in einfachen Anführungszeichen werden schließlich zu einem einzigen Argument / Ausdruck verkettet. Es gibt keinen Verkettungsoperator in bash. Sie platzieren einfach Zeichenfolgen nacheinander ohne Leerzeichen dazwischen.
Das wird
$'\t'
in Bash als wörtliches Tabulatorzeichen aufgelöst (unter Verwendung von ANSI-C-Anführungszeichen ), sodass der Tabulator korrekt mit dem Ausdruck verknüpft wird.quelle
sed: Not a recognized flag: i
t
:)\t
ist eine Registerkarte für diejenigen, die es vielleicht noch nicht wissen.Zumindest bei Mountain Lion entfernt Viktors Antwort auch das Zeichen 't', wenn es sich am Ende einer Zeile befindet. Das folgende Problem wird behoben:
quelle
-E
Hinweis auf "erweiterte (moderne) reguläre Ausdrücke"sed
auf El Capitan nicht.Vielen Dank an codaddict für den Vorschlag der
-i
Option.Der folgende Befehl löst das Problem bei Snow Leopard
quelle
\t
mit sed außer GNU sed verwenden und es wird als wörtlicher Buchstabe interpretiertt
. Der Befehl scheint nur zu funktionieren, wahrscheinlich weil sich keine TABs im nachfolgenden Leerzeichen oder eint
am Ende eines Satzes in Ihrer Datei befinden. Die Verwendung''
ohne Angabe eines Sicherungssuffix wird nicht empfohlen.Es ist am besten, auch $ 1 zu zitieren:
quelle
quelle
Ich habe ein Skript in meiner .bashrc, das unter OSX und Linux funktioniert (nur Bash!)
zu dem ich hinzufüge:
quelle
Für diejenigen, die nach Effizienz suchen (viele zu verarbeitende Dateien oder große Dateien), macht die Verwendung des
+
Wiederholungsoperators*
den Befehl mehr als zweimal schneller.Mit GNU sed:
Ich habe auch schnell etwas anderes verglichen : Verwenden
[ \t]
statt stattdessen[[:space:]]
den Prozess erheblich zu beschleunigen (GNU sed v4.4):quelle
Nur zum Spaß:
quelle
Im konkreten Fall von
sed
ist die-i
Option, die andere bereits erwähnt haben, bei weitem die einfachste und vernünftigste.Im allgemeineren Fall macht
sponge
diemoreutils
Sammlung genau das, was Sie wollen: Sie können eine Datei durch das Ergebnis der Verarbeitung ersetzen, und zwar auf eine Weise, die speziell dafür ausgelegt ist, dass der Verarbeitungsschritt nicht über sich selbst stolpert, indem genau die Datei überschrieben wird, um die es sich handelt arbeiten an. Um diesponge
Manpage zu zitieren :https://joeyh.name/code/moreutils/
quelle
So entfernen Sie nur Leerzeichen (in meinem Fall Leerzeichen und Tabulatoren) von Zeilen mit mindestens einem Nicht-Leerzeichen (auf diese Weise werden leere eingerückte Zeilen nicht berührt):
quelle