Mam ciąg podobny do następującego:
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600
teraz chcę zastąpić wszystkie tabulatory / spacje między rekordami tylko jedną spacją, aby z łatwością móc z niej korzystać cut -d " "
Próbowałem następujące:
sed "s/[\t[:space:]]+/[:space:]/g"
i różne odmiany, ale nie mogłem go uruchomić. Jakieś pomysły?
cut
wsparcia-w
?Odpowiedzi:
Posługiwać się
sed -e "s/[[:space:]]\+/ /g"
Oto wyjaśnienie:
W celu wymiany chcesz wstawić tylko spację.
[:space:]
nie będzie tam działał, ponieważ jest to skrót od klasy postaci, a silnik regex nie wiedziałby, jaką postać tam umieścić.+
Musi być uciekł w regex ponieważ z SED regex silnika+
jest normalną postać natomiast\+
jest Metaznak dla „jednej lub więcej”. Na stronie 86 Mastering Regular Expressions Jeffrey Friedl wspomina w przypisie, że ed i grep używają nawiasów ucieczkowych, ponieważ „Ken Thompson uważał, że wyrażenia regularne będą używane głównie do pracy z kodem C, gdzie potrzeba dopasowania surowych nawiasów byłaby bardziej powszechna niż odwracanie . ” Zakładam, że tak samo czuł się ze znakiem plus, stąd potrzeba ucieczki przed nim, aby użyć go jako metaznaku. Łatwo się o to potknąć.W sed musisz uciec
+
,?
,|
,(
, i)
. lub użyj -r, aby użyć rozszerzonego wyrażenia regularnego (wtedy wygląda jaksed -r -e "s/[[:space:]]\+/ /g"
lubsed -re "s/[[:space:]]\+/ /g"
źródło
\+
zamiast po prostu+
?\+
Możesz użyć opcji
-s
(„ściśnij”)tr
:[:blank:]
Klasa znaków obejmuje zarówno przestrzenie i kart.źródło
Lubię używać następującego aliasu do bash. Opierając się na tym, co napisali inni, użyj sed, aby wyszukać i zastąpić wiele spacji jedną spacją. Pomaga to uzyskać spójne wyniki cięcia. Na koniec uruchamiam go jeszcze raz, aby zmienić spację na tabulator, aby ułatwić czytanie.
źródło