To jsou skutečně dvě otázky a měly by být rozděleny. Ale protože jsou odpovědi poměrně jednoduché, dám je sem. Tyto odpovědi jsou pro GNU grep
konkrétně.
a) egrep
je stejný jako grep -E
. Oba znamenají, že by se místo grep
mělo používat "Rozšířené regulární výrazy". výchozí regulární výrazy. grep
vyžaduje zpětná lomítka pro obyčejné regulární výrazy.
Z man
stránka:
Základní vs. rozšířené regulární výrazy
V základních regulárních výrazech metaznaky ? , + , , | , ( a ) ztrácejí svůj zvláštní význam; místo toho použijte verze se zpětným lomítkem \? , \+ , \{ , \| , \( a \) .
Viz man
stránku pro další podrobnosti o historických konvencích a přenositelnosti.
b) Použijte egrep '(.)\1{N}'
a nahraďte N
s počtem znaků, které chcete nahradit mínus jeden (protože tečka odpovídá prvnímu). Pokud tedy chcete porovnat znak opakující se čtyřikrát, použijte egrep '(.)\1{3}'
.
To by hledalo 2 nebo více výskytů stejného znaku:
grep -E '(.)\1+' file
Pokud má váš awk volbu -o, vypíše to každou shodu na nový řádek..
grep -Eo '(.)\1+' file
Chcete-li najít shody s přesně 3 shodami:
grep -E '(.)\1{2}' file
Nebo 3 nebo více:
grep -E '(.)\1{2,}' file
atd..
upravit
Ve skutečnosti má @stephane_chazelas pravdu ohledně zpětných odkazů a -E. Na to jsem zapomněl. Zkoušel jsem to v BSD grep a GNU grep a tam to funguje, ale v některých jiných grep to není. Budete muset použít jednu z níže uvedených verzí..
Běžné verze grepu:
grep '\(.\)\1\{1,\}' file
grep -o '\(.\)\1\{1,\}' file
grep '\(.\)\1\{2\}' file
grep '\(.\)\1\{2,\}' file
-o
volba také není standardní grep BTW (pravděpodobně pokud váš grep rozumí -o může také udělat zpětnou referenci)..
Poznámka :grep -E '(.)\1{2,}'
soubor a grep '\(.\)\1\{2\}'
soubory jsou chybné, jak je uvedeno alexis a měly by být ignorovány..
Nejprve vám všem děkuji za vaše podpůrné komentáře a návrhy. Jak se ukázalo, už jsem byl docela blízko odpovědi.
Hlavní problém byl o:
Existuje jednoduchý způsob, jak hledat n výskyty stejného znaku, např.
aa
,tttttt
Krátká odpověď :
Následující [variace] příkazů se budou opakovat a
alespoň jednou a nekonečněkrát
grep 'a\{1,}
grep -E \(a\)\{1,\}
egrep a{1,}
nebo s dostupnými regulárními výrazy GNUgrep a\+
Počet opakování se nastavuje ve složených závorkách pomocí vzoru {min,max}
→ {n}
opakujte přesně n
krát, {n,}
opakujte alespoň n
krát a {n,m}
opakujte alespoň n
ale maximálně m
krát.
V důsledku toho se objevil sekundární problém :
Je nutnost nastavení vůle vázána na příkaz Iuse?
Krátká odpověď :Ano, použití zpětných lomítek závisí na tom, zda se používá grep
nebo egrep
grep
:zpětné lomítko aktivuje metaznaky [používá základní regulární výrazy]egrep
zpětné lomítko de -aktivuje metaznaky [používá rozšířené regulární výrazy]
Protože toto je krátká odpověď, chci poskytnout těm, kteří narazili na srovnatelné problémy, přidal jsem své základní shrnutí toho, čeho si člověk zdánlivě musí být vědom, pracuji s grep
a egrep
.
Základní, rozšířené a regulární výrazy GNU
Základní regulární výrazy
Používá se v grep
, ed
a sed
příkaz
Základní funkce sady regulárních výrazů jsou:
- Většina metaznaků, např.
? [ . \ )
atd. se aktivují zpětným lomítkem. Pokud zde není žádné zpětné lomítko, budou považovány za (součást) hledaného výrazu. ^ $ \<
a\>
jsou podporovány bez zpětného lomítka- Žádné zkrácené znaky [
\b
,\s
atd.]
GNU K nim se přidávají základní regulární výrazy
\?
opakujte znak nula nebo jednou (c\?
odpovídác
acc
) a je alternativou pro\{0,1\}
-
\+
opakujte znak alespoň jednou (c\+
odpovídácc
,cccccccc
atd.) a je alternativou pro\{1,\}
-
\|
je podporováno (např.grep a\|b
bude hledata
nebob
grep -E
umožňuje příkazu používat celou sadu rozšířených regulárních výrazů:
Rozšířené regulární výrazy [ERE]
Použito v egrep
, awk
a emacs
je základní sada plus několik funkcí.
- Metaznaky se deaktivují zpětným lomítkem
- Žádné zpětné odkazy
- jinak:spousta kouzel, které regulární výrazy obvykle dokážou udělat pro jednoho
GNU Rozšíření regulárních výrazů
přidává následující funkce
- kurzy zkráceného textu
- kvantifikátory
Dva odkazy přesměrují jeden na regular-expressions.info, což mi kromě skvělé podpory, kterou zde mám, opravdu hodně pomohlo.