Ich möchte alle führenden und nachfolgenden Leerzeichen und Tabulatoren aus jeder Zeile in einer Ausgabe entfernen.
Gibt es ein einfaches Tool, in das trim
ich meine Ausgabe umleiten kann?
Beispieldatei:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Antworten:
oder kürzer:
Trimmt führende und nachfolgende Leerzeichen oder Tabulatorzeichen 1 und drückt auch Folgen von Tabulatoren und Leerzeichen in ein einzelnes Leerzeichen.
Das funktioniert, weil Sie, wenn Sie einem der Felder etwas zuweisen ,
awk
den gesamten Datensatz (wie von gedrucktprint
) neu erstellen, indem Sie alle Felder ($1
, ...,$NF
) mitOFS
(standardmäßig Leerzeichen) verbinden.1 (und möglicherweise andere Leerzeichen, abhängig vom Gebietsschema und der
awk
Implementierung)quelle
awk '{$1=$1}1'
;
ist in der Standard-awk-Syntax erforderlichecho -e 'foo \t bar' | awk '{$1=$1};1'
echo ' hello ' | xargs
Der Befehl kann wie folgt zusammengefasst werden, wenn Sie GNU verwenden
sed
:Beispiel
Hier ist der obige Befehl in Aktion.
Sie können
hexdump
damit bestätigen, dass dersed
Befehl die gewünschten Zeichen korrekt entfernt.Zeichenklassen
Sie können auch Zeichenklassennamen verwenden, anstatt die Mengen wie folgt buchstäblich aufzulisten
[ \t]
:Beispiel
Die meisten GNU-Tools, die reguläre Ausdrücke (Regex) verwenden, unterstützen diese Klassen.
Die Verwendung dieser anstelle von Literalmengen scheint immer eine Verschwendung von Speicherplatz zu sein. Wenn Sie jedoch befürchten, dass Ihr Code portierbar ist oder mit alternativen Zeichensätzen umgehen muss (denken Sie an Internationalität), sollten Sie wahrscheinlich die Klassennamen verwenden stattdessen.
Verweise
quelle
[[:space:]]
nicht[ \t]
dem allgemeinen Fall (Unicode usw.) entspricht.[[:space:]]
wird wahrscheinlich viel langsamer sein (da Unicode viel mehr Arten von Leerzeichen enthält als nur' '
und'\t'
). Das Gleiche für alle anderen.sed 's/^[ \t]*//'
ist nicht tragbar. In POSIX ist es sogar erforderlich, dass eine Folge von Leerzeichen, Backslash odert
Zeichen entfernt wird, und genau dassed
tut GNU auch, wennPOSIXLY_CORRECT
es sich in der Umgebung befindet.sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
Wie von Stéphane Chazelas in der akzeptierten Antwort vorgeschlagen, können Sie jetzt
ein Skript erstellen
/usr/local/bin/trim
:und gib dieser Datei die ausführbaren Rechte:
Jetzt können Sie jeden Ausgang zum
trim
Beispiel übergeben:(für die Kommentare unten: Ich habe das schon mal benutzt:
while read i; do echo "$i"; done
das funktioniert auch gut, ist aber weniger performant)
quelle
while read -r line
Schrägstriche zu erhalten und selbst dann ... . In Bezug auf riesige Dateien / Geschwindigkeit haben Sie sich für die schlechteste Lösung entschieden. Ich glaube nicht, dass es irgendetwas Schlimmeres gibt. Lesen Sie die Antworten unter Warum wird eine Shell-Schleife zum Verarbeiten von schlechtem Text verwendet? einschließlich meines Kommentars zur letzten Antwort, bei der ich einen Link zu einem Geschwindigkeits-Benchmark hinzugefügt habe. Diesed
Antworten hier sind meiner Meinung nach völlig in Ordnung und weitaus besser alsread
.-
Kombination von 1 oder mehreren e-, E- oder n-Zeichen beginnen und darauf folgen und / oder NUL-Zeichen enthalten. Auch eine nicht terminierte Zeile nach der letzten neuen Zeile wird übersprungen.xargs ohne Argumente machen das.
Beispiel:
quelle
xargs
es nicht funktioniert, wenn die Eingabe Backslashes und einfache Anführungszeichen enthält.echo
Aufrufe ausgeführt. Einige Echo-Implementierungen verarbeiten auch Optionen und / oder Backslashes ... Das funktioniert auch nur bei einzeiliger Eingabe.Wenn Sie eine Zeile in eine Shell-Variable einlesen,
read
geschieht dies bereits, sofern nicht anders angegeben .quelle
read
. Wenn Sie also beim Lesen eine Pipe verwenden, funktioniertcat file | while read i; do echo $i; done
echo "$i"
dieseread
Wenn Sie Zeilen als Variablen speichern, können Sie den Job mit bash erledigen:
Führende Leerzeichen aus einem String entfernen:
Entfernen Sie nachfolgende Leerzeichen aus einem String:
Entfernen Sie alle Leerzeichen aus einer Zeichenfolge:
quelle
Um alle führenden und nachfolgenden Leerzeichen einer bestimmten Zeile mithilfe eines Pipe-Tools zu entfernen, kann ich drei verschiedene Wege identifizieren, die nicht vollständig gleichwertig sind. Diese Unterschiede betreffen die Leerzeichen zwischen den Wörtern der Eingabezeile. Abhängig vom erwarteten Verhalten treffen Sie Ihre Wahl.
Beispiele
Um die Unterschiede zu erklären, betrachten wir diese Dummy-Eingabezeile:
tr
tr
ist wirklich ein einfacher Befehl. In diesem Fall werden Leerzeichen oder Tabellierungszeichen gelöscht.awk
awk
löscht führende und abschließende Leerzeichen und drückt alle Leerzeichen zwischen Wörtern auf ein einzelnes Leerzeichen.sed
In diesem Fall werden
sed
führende und nachfolgende Leerzeichen gelöscht, ohne dass Leerzeichen zwischen Wörtern berührt werden.Anmerkung:
Bei einem Wort pro Zeile
tr
erledigt der Job.quelle
[:space:]
anstelle von [: blank:] den Befehltr
wie... | tr -d [:space:]
:, um auch Zeilenumbrüche zu entfernen. (siehe:man tr
)sed ist ein großartiges Werkzeug dafür:
Sie können es für Ihren Fall verwenden, indem Sie entweder den Text weiterleiten, z
oder indem du darauf 'inline' reagierst, wenn du
sed
die GNU bist:Das Ändern der Quelle auf diese Weise ist jedoch "gefährlich", da sie möglicherweise nicht wiederhergestellt werden kann, wenn sie nicht ordnungsgemäß funktioniert (oder sogar, wenn dies der Fall ist!). Sichern Sie also zuerst (oder verwenden Sie diese Methode
-i.bak
, um auf einige BSDs portierbar zu seinsed
). !quelle
Der Übersetzungsbefehl würde funktionieren
quelle
Wenn der zu trimmende String kurz und zusammenhängend ist, kann er einfach als Parameter an eine beliebige Bash-Funktion übergeben werden:
quelle