it-swarm.com.de

sed Ersetzen Sie alle Tabulatoren und Leerzeichen durch ein einziges Leerzeichen

Ich habe eine Zeichenfolge wie die folgende:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

jetzt möchte ich alle Tabulatoren/Leerzeichen zwischen den Datensätzen durch nur ein Leerzeichen ersetzen, damit ich es problemlos mit cut -d " " verwenden kann.

Ich habe folgendes versucht:

sed "s/[\t[:space:]]+/[:space:]/g"

und verschiedene Varianten, konnte es aber nicht zum Laufen bringen. Irgendwelche Ideen?

26
Zulakis

Verwenden sed -e "s/[[:space:]]\+/ /g"

Hier ist eine Erklärung:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

Als Ersatz möchten Sie nur ein Leerzeichen einfügen. [:space:] funktioniert dort nicht, da dies eine Abkürzung für eine Zeichenklasse ist und die Regex-Engine nicht weiß, welches Zeichen dort abgelegt werden soll.

Das + muss im Regex maskiert werden, da mit der Regex-Engine von sed + ist ein normales Zeichen, während \+ ist ein Metazeichen für 'eins oder mehrere'. Auf Seite 86 von Beherrschen regulärer Ausdrücke erwähnt Jeffrey Friedl in einer Fußnote, dass ed und grep Escape-Klammern verwendeten, weil "Ken Thompson der Ansicht war, dass reguläre Ausdrücke hauptsächlich für C-Code verwendet werden, wenn Raw-Übereinstimmungen erforderlich sind Klammern wären häufiger als Rückreferenzen. " Ich gehe davon aus, dass er das Pluszeichen genauso sah, daher die Notwendigkeit, ihm zu entkommen, um es als Metazeichen zu verwenden. Es ist leicht, sich darüber zu stolpern.

In sed musst du entkommen +, ?, |, (, und ). oder verwenden Sie -r, um erweiterten regulären Ausdruck zu verwenden (dann sieht es aus wie sed -r -e "s/[[:space:]]\+/ /g" oder sed -re "s/[[:space:]]\+/ /g"

44
Starfish

Du kannst den ... benutzen -s ("Squeeze") Option von tr:

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

Das [:blank:] Zeichenklasse umfasst sowohl Leerzeichen als auch Tabulatoren.

6
Benjamin W.