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 ein einziges Leerzeichen ersetzen, damit ich es problemlos verwenden kann cut -d " "
Ich habe folgendes versucht:
sed "s/[\t[:space:]]+/[:space:]/g"
und verschiedene Varianten, aber konnte es nicht zum Laufen bringen. Irgendwelche Ideen?
cut
Unterstützung eine-w
Option?Antworten:
Verwenden
sed -e "s/[[:space:]]\+/ /g"
Hier ist eine Erklärung:
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 sie dort ablegen soll.Das
+
muss in der Regex maskiert werden, da die Regex-Engine von sed+
ein normales Zeichen ist, wohingegen\+
es ein Metazeichen für 'ein oder mehrere' ist. Auf Seite 86 von " Beherrschen regulärer Ausdrücke" erwähnt Jeffrey Friedl in einer Fußnote, dass ed und grep geschützte Klammern verwendeten, weil "Ken Thompson der Ansicht war, dass reguläre Ausdrücke verwendet würden, um hauptsächlich mit C-Code zu arbeiten . " Ich gehe davon aus, dass er das Pluszeichen genauso empfand, daher die Notwendigkeit, es zu umgehen, um es als Metazeichen zu verwenden. Es ist leicht, sich davon auszulösen.In sed Sie fliehen müssen
+
,?
,|
,(
, und)
. oder verwende -r, um einen erweiterten regulären Ausdruck zu verwenden (dann sieht es aus wiesed -r -e "s/[[:space:]]\+/ /g"
odersed -re "s/[[:space:]]\+/ /g"
quelle
\+
anstelle von nur verwenden+
?\+
Sie können die
-s
("Squeeze") Option verwenden vontr
:Die
[:blank:]
Zeichenklasse umfasst sowohl Leerzeichen als auch Tabulatoren.quelle
Ich benutze gerne den folgenden Alias für bash. Bauen Sie auf dem auf, was andere geschrieben haben, und verwenden Sie sed, um mehrere Leerzeichen zu suchen und durch ein einziges zu ersetzen. Dies hilft, konsistente Schnittergebnisse zu erzielen. Am Ende durchlaufe ich noch einmal sed, um das Leerzeichen in einen Tabulator umzuwandeln, damit es einfacher zu lesen ist.
quelle