Szukam wyrażenia regularnego, które wyszukuje wszystkie wystąpienia podwójnych znaków w tekście, liście itp. W wierszu poleceń (Bash).
Głównym Pytanie : Czy istnieje prosty sposób do poszukiwania takich sekwencji aa
, ll
, ttttt
, itd., Gdzie jeden definiuje wyrażenie regularne, które szuka n wystąpień tego samego znaku z? To, czego szukam, to osiągnięcie tego na bardzo podstawowym poziomie. W wierszu poleceń. W powłoce Linux.
Po kilku badaniach doszedłem do następujących odpowiedzi - i wynikających z nich pytań, dlatego dały mi one wskazówkę, gdzie może być rozwiązanie. Ale:
a) (e) grep i problem z odwrotnym ukośnikiem
grep 'a\{2\}'
szukaaa
egrep'a{2}'
szukaaa
Pytanie: Czy konieczność ustawienia luzów jest naprawdę związana z poleceniem, którego używam? Jeśli tak, to czy ktoś może dać mi wskazówkę, co jeszcze należy wziąć pod uwagę, używając tutaj (e) grep?
b) Znalazłem tutaj odpowiedź na moje pytanie, chociaż nie jest to dokładnie to, czego szukałem:
grep -E '(.)\1' filename
szuka wpisów z tym samym znakiem pojawiających się więcej niż jeden raz, ale nie pyta, jak często . To jest blisko tego, czego szukam, ale nadal chcę ustawić wiele powtórzeń.
Prawdopodobnie powinienem podzielić to na dwa lub więcej pytań, ale nie chcę tutaj zalewać tej niesamowitej strony.
PS: Jeszcze jedno pytanie, może nie na temat ale: czy to in
, inside
, at
lub on the shell
. I jest on the command line
poprawne?
egrep
jeśli potrzebuję wyrażeń regularnych (w przeciwieństwie do zwykłego dopasowywania ciągów), aby nie musiałem się martwić pamiętaniem różnic międzygrep
nimi rodzaje wyrażeń regularnych.grep '\(.\)\1\{3\}'
jest standardem,grep -E '(.)\1{3}'
nie jest.To szukałoby 2 lub więcej wystąpień tej samej postaci:
Jeśli twój awk ma opcję -o, to wypisuje go za każdym razem w nowej linii.
Aby znaleźć mecze z dokładnie 3 dopasowaniami:
Lub 3 lub więcej:
itp..
edytować
W rzeczywistości @stephane_chazelas ma rację co do referencji i -E. Zapomniałem o tym. Próbowałem go w BSD grep i GNU grep i działa tam, ale nie ma go w innych greps. Musisz użyć jednej z poniższych wersji ..
Zwykłe wersje grep:
Ta
-o
opcja również nie jest standardowym grep BTW (prawdopodobnie jeśli twój grep rozumie -o, może również zrobić referencję wstecz).Uwaga :
grep -E '(.)\1{2,}'
plik igrep '\(.\)\1\{2\}'
plik są niepoprawne, jak wskazuje Alexis, i należy je zignorować.źródło
-E
opcjigrep
nie zrobi dużo? To by wyjaśniało całkiem sporo, na przykład dlaczego tak wiele czasu traciłem na szukanie, gdzie się mylę!+
operatora. Podam też przykłady.grep -E '(.)\1{2}'
nie do końca „Znajdź dopasowania z dokładnie 3 dopasowaniami”. Chociaż będzie pasował dokładnie trzy identyczne znaki, mogą być osadzone w dłuższym powtarzanym ciągu; np. będzie pasować do ciągu 5-symbolowegoAAAAA
. (A jeśli jest 6 lub więcej kolejnych symboli, dopasuje się więcej niż jeden raz).Po pierwsze, dziękuję wszystkim za komentarze i sugestie. Jak się okazuje, byłem już dość blisko odpowiedzi.
Głównym problemem było o:
Krótka odpowiedź :
Następujące [warianty] poleceń powtórzą
a
co najmniej jeden i nieskończony czasgrep 'a\{1,}
grep -E \(a\)\{1,\}
egrep a{1,}
lub z dostępnymi wyrażeniami regularnymi GNU
grep a\+
Liczbę powtórzeń ustawia się w nawiasach klamrowych, poprzez wzór
{min,max}
→{n}
powtórz dokładnien
razy,{n,}
powtórz co najmniejn
raz i{n,m}
powtórz co najmniej,n
ale najczęściejm
.W związku z tym podniósł kwestię drugorzędną :
Krótka odpowiedź : Tak, użycie odwrotnych ukośników zależy od tego, czy się używa,
grep
czyegrep
grep
: odwrotny ukośnik aktywuje metaznaki [używa podstawowych wyrażeń regularnych]egrep
backslash de -activates metaznakami [używa rozszerzeń wyrażenia regularne]Ponieważ jest to krótka odpowiedź, chcę przekazać tym, którzy napotkali podobne problemy, dodałem moje podstawowe podsumowanie tego, o czym na pozór trzeba być świadomym, pracując z
grep
iegrep
.Wyrażenia podstawowe, rozszerzone i GNU
Podstawowe wyrażenia regularne
Używany w
grep
,ed
ised
poleceniaPodstawowe funkcje zestawu wyrażeń regularnych to:
? [ . \ )
Itp., Jest aktywowanych za pomocą odwrotnego ukośnika. Jeśli nie wystąpi ukośnik odwrotny, będą one traktowane jako (część) wyszukiwanego terminu.^ $ \<
i\>
są obsługiwane bez ukośnika odwrotnego\b
,\s
itp]Podstawowe wyrażenia regularne GNU dodają je
\?
powtórz znak zero lub jeden raz (c\?
meczec
icc
) i jest alternatywą dla\{0,1\}
\+
Powtarzam postać co najmniej jeden raz (c\+
meczecc
,cccccccc
itd) i jest alternatywą dla\{1,\}
\|
jest obsługiwany (np.grep a\|b
będzie szukała
lubb
grep -E
włącza polecenie do korzystania z całego zestawu rozszerzonych wyrażeń regularnych:Rozszerzone wyrażenia regularne [ERE]
Używany w
egrep
,awk
iemacs
jest położony Basic Plus całkiem pewne cechy.GNU Rozszerz wyrażenia regularne
dodaje następujące funkcje
Oba linki przekierują jeden do regular-expressions.info, który oprócz niesamowitego wsparcia, które tu mam, naprawdę mi bardzo pomógł.
źródło