Czy jest jakiś sposób na przekazanie informacji sed
tylko wychwyconym grupom? Na przykład biorąc pod uwagę dane wejściowe:
This is a sample 123 text and some 987 numbers
i wzór:
/([\d]+)/
Czy mogę uzyskać tylko dane wyjściowe 123 i 987 w sposób sformatowany przez odwołania zwrotne?
sed
włączenia rozszerzonych wyrażeń regularnych z-E
flagą.Odpowiedzi:
Kluczem do tego, aby zadziałało, jest
sed
wykluczenie tego, czego nie chcesz, aby dane wyjściowe, a także określenie tego, czego chcesz.To mówi:
-n
)p
)Ogólnie rzecz biorąc,
sed
przechwytujesz grupy za pomocą nawiasów i wyświetlasz to, co przechwytujesz, korzystając z referencji wstecz:wyświetli „pasek”. Jeśli używasz
-r
(-E
dla OS X) rozszerzonego wyrażenia regularnego, nie musisz uciekać z nawiasów:Może istnieć do 9 grup przechwytywania i ich referencje. Odwołania wsteczne są ponumerowane w kolejności, w jakiej pojawiają się grupy, ale można ich używać w dowolnej kolejności i można je powtarzać:
wyprowadza „słupek a”.
Jeśli masz GNU
grep
(może również działać w BSD, w tym OS X):lub odmiany, takie jak:
Ta
-P
opcja włącza wyrażenia regularne zgodne z Perlem. Zobaczman 3 pcrepattern
lubman 3 pcresyntax
.źródło
sed
przykładu, jeśli korzystasz z-r
opcji (lub-E
dla OS X, IIRC), nie musisz uciekać od nawiasów. Różnica polega na tym, że między podstawowymi wyrażeniami regularnymi a rozszerzonymi wyrażeniami regularnymi (-r
).Sed ma do dziewięciu zapamiętanych wzorców, ale musisz użyć nawiasów ucieczkowych, aby zapamiętać fragmenty wyrażenia regularnego.
Zobacz tutaj przykłady i więcej szczegółów
źródło
sed -e 's/version=\(.+\)/\1/' input.txt
to wciąż wypisze cały input.txt\+
zamiast+
. I nie rozumiem, dlaczego ludzie używają-e
tylko jednego polecenia sed.sed -e -n 's/version=\(.+\)/\1/p' input.txt
zobacz: mikeplate.com/2012/05/09/…sed -E
użycie tak zwanych „nowoczesnych” lub „rozszerzonych” wyrażeń regularnych, które wyglądają znacznie bliżej Perl / Java / JavaScript / Go / cokolwiek innego. (Porównaj zgrep -E
lubegrep
.) Domyślna składnia ma dziwne reguły ucieczki i jest uważana za „przestarzałą”. Aby uzyskać więcej informacji na temat różnic między nimi, uruchomman 7 re_format
.możesz użyć grep
źródło
o
istnieje taka opcja - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, - tylko dopasowanie Dopasuj tylko część pasującego wiersza pasującego WZORZECgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
Nie wiem, jak możesz wymagać, aby te dwa wyrażenia znajdowały się w jednym wierszu oprócz pipingu z poprzedniego grep (który wciąż nie mógłby działać, jeśli którykolwiek wzorzec pasuje więcej niż jeden raz w wierszu ).liczba cyfr
Ta odpowiedź działa z dowolną liczbą grup cyfr. Przykład:
Rozszerzona odpowiedź.
Tak. zastąp cały tekst grupą przechwytywania:
Lub z rozszerzoną składnią (mniej cudzysłowów i zezwól na użycie +):
Aby uniknąć drukowania oryginalnego tekstu, gdy nie ma numeru, użyj:
Aby dopasować kilka liczb (a także je wydrukować):
Działa to dla dowolnej liczby przebiegów cyfrowych:
Co jest bardzo podobne do polecenia grep:
Informacje o \ d
Sed nie rozpoznaje składni „\ d” (skrót). Stosowany powyżej ekwiwalent ascii
[0-9]
nie jest dokładnie równoważny. Jedynym alternatywnym rozwiązaniem jest użycie klasy znaków: „[[: digit:]]„.Wybrana odpowiedź używa takich „klas znaków” do zbudowania rozwiązania:
To rozwiązanie działa tylko dla (dokładnie) dwóch serii cyfr.
Oczywiście, ponieważ odpowiedź jest wykonywana wewnątrz powłoki, możemy zdefiniować kilka zmiennych, aby skrócić taką odpowiedź:
Ale, jak już wyjaśniono,
s/…/…/gp
lepsze jest użycie polecenia:Obejmuje to zarówno powtarzające się serie cyfr, jak i pisanie krótkich (er) komend.
źródło
Uważam, że wzorzec podany w pytaniu był jedynie przykładowy, a celem było dopasowanie dowolnego wzorca.
Jeśli masz sed z rozszerzeniem GNU pozwalającym na wstawienie nowego wiersza w przestrzeni wzorów, jedną z sugestii jest:
Te przykłady są z tcsh (tak, wiem, że to zła powłoka) z CYGWIN. (Edycja: Dla bash, usuń set, a spacje wokół =.)
źródło
+
, musisz uciec z niego lub skorzystać z-r
opcji (-E
dla OS X). Możesz także użyć\{1,\}
(-r
lub-E
bez ucieczki).Zrezygnuj i użyj Perla
Ponieważ
sed
go nie tnie, po prostu rzućmy ręcznikiem i użyjmy Perla, przynajmniej LSB, podczas gdygrep
rozszerzenia GNU nie są :-)Wydrukuj całą pasującą część, nie trzeba dopasowywać grup ani szukać:
Wynik:
Pojedyncze dopasowanie w wierszu, często uporządkowane pola danych:
Wynik:
Z lookbehind:
Wiele pól:
Wynik:
Wiele dopasowań w wierszu, często nieustrukturyzowane dane:
Wynik:
Z lookbehind:
Wynik:
źródło
Próbować
Mam to pod cygwin:
źródło
Nie o to prosił PO (przechwytywanie grup), ale możesz wyodrębnić liczby, używając:
Daje następujące:
źródło