Jak dopasować cyfry, a następnie kropkę za pomocą sed?


76

Próbuję użyć seddo zastąpienia wszystkich wzorców cyframi, po których natychmiast następuje kropka (np. 3., 355.) Pusty ciąg znaków. Więc próbuję:

sed 's/\d+\.//g' file.txt

Ale to nie działa. Dlaczego?


1
Uważam, że ten artykuł jest bardzo przydatny
Stphane

Odpowiedzi:


111

Ponieważ sed nie jest perlem - wyrażenia regularne sed nie mają \dskrótu:

sed 's/[[:digit:]]\+\.//g'

tutaj znajduje się dokumentacja wyrażeń regularnych .


3
To jest, jeśli chcesz zero lub więcej cyfr. /[[:digit:]]*\. /dopasuje ciąg, foo.ponieważ dopuszczasz zero cyfr. Jeśli chcesz użyć jednego lub więcej, \+jak pokazano
glenn jackman

71

Dwa problemy:

  1. sednie obsługuje \d. Użyj [0-9]lub [[:digit:]].

  2. +Należy odwrotnym ukośnikiem, aby uzyskać specjalne znaczenie: \+.


6
zamiast odwrotnego ukośnika + (który nie działa na przykład w systemie Mac OS X), możesz użyć opcji -E interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).Niestety, nie pomaga to z problemem \ d ...
gMale

4
@gmale: -Enie działa dla GNU sed, -rzamiast tego używa .
choroba

12
Ok ... wygląda na sedto, że jest do bani, jeśli chodzi o przenośność ...
iconoclast

@choroba Chyba się dzisiaj pomyliłem. Usunę moje głośne komentarze ...
Steven Lu

Zasadniczo próbowałem ostrzec ludzi: Jeśli nie używasz rozszerzonego wyrażenia regularnego ( -Ena BSD sed i -rGNU sed), w BSD sed, ani +nor \+(to samo z ?) w ogóle nie będzie działać, podczas gdy w GNU sed możesz zachęć ich do pracy z odwrotnym ukośnikiem. Stąd powszechna rekomendacja używania rozszerzonego wyrażenia regularnego w skryptach
Steven Lu

3

Strona man sed odwołuje się do strony man re_format. To czyni 2 rozróżnienia: (1) przestarzałe w porównaniu do rozszerzonych wyrażeń regularnych; (2) nieulepszone kontra ulepszone wyrażenia regularne. Możliwe są wszystkie 4 kombinacje. Istnieje wsparcie zarówno dla przestarzałych, jak i rozszerzonych, ale w obu przypadkach tylko dla nieulepszonych. Operator \ d jest funkcją ulepszonych wyrażeń regularnych, dlatego nie jest obsługiwany przez sed.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.