grep dla ciągów alfanumerycznych o dowolnej długości z dwukropkiem po każdej stronie


14

Jak grep szukałby ciągów alfanumerycznych od 1 do 50 znaków (najlepiej by każda długość też działała) z dwukropkiem po każdej stronie - typowym wynikiem byłyby wszystkie linie zawierające ciąg :shopping:. Do tej pory mam poniższy kod (wypróbowałem kilka jego odmian), który nie działa:

grep ':[[:alnum:]]{1,100}:' ~/x.txt

Musisz tylko włączyć rozszerzone możliwości wyrażenia regularnego, grepwłączając -Eprzełącznik.
slm

Odpowiedzi:


13

W tym celu musisz włączyć rozszerzone wyrażenia regularne:

grep -E ':[[:alnum:]]+:' ~/x.txt

4

Za pomocą podstawowych wyrażeń regularnych możesz napisać:

grep ':[[:alnum:]]\{1,100\}:' ~/x.txt

Należy pamiętać, że \{(w przeciwieństwie do \+lub \?na przykład) jest standardowy i przenośny, a tak naprawdę odpowiedniki BRE +i ?są zwykle napisane za pomocą \{: \{1,\}i \{0,1\}. grep -Ejest również standardowy i przenośny, więc równie dobrze możesz go użyć, ponieważ w tych przypadkach zapewnia bardziej czytelne wyrażenia regularne.


1

Używasz rozszerzonej regularnej ekspresji, więc musisz użyć opcji -E:

grep -E ':[[:alnum:]]{1,100}:' ~/x.txt

dzięki! Drugą odpowiedź podałem jako poprawną, ponieważ nie napisałem mojego „idealnego” skryptu w nagłówku i nie chcę, aby ludzie, którzy szukają odpowiedzi w Google, wkleili złą odpowiedź, ale użyję twojej. :)

1
@TorThommesen - możesz edytować tytuł swojego Q, jeśli nie jest poprawny.
slm

0

Ponieważ nikt o tym nie wspominał, możesz również użyć egrep, co, jak rozumiem, jest równoważne grep -E.

egrep ':[[:alnum:]]{1,100}:' ~/x.txt

1
egrepbyło historycznym poleceniem grep z ERE. Funkcje grep i egrep zostały (dawno temu) połączone w grep z opcją -E. egrepjest teraz uważany za przestarzały / przestarzały (ale jest mało prawdopodobne, aby przejść, ponieważ niektórzy ludzie są do tego przyzwyczajeni).
Stéphane Chazelas,
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.