GNU/Linux >> Znalost Linux >  >> Linux

Regulární výraz pro hledání dvojitých znaků v Bash

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 a cc ) 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 hledat a nebo b

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.


Linux
  1. Použití Bash pro automatizaci

  2. Bash:Regulární výrazy v substituci?

  3. základy grep

  1. 6 Bashových příkladů podmíněných výrazů ( -e, -eq, -z, !=, [, [[ ..)

  2. Bash for smyčky Příklady

  3. Jak převrátit výraz grep

  1. Tr Analog pro znaky Unicode?

  2. Problém(y) s regulárním výrazem v Bash:[^negate] zřejmě nefunguje

  3. číselný rozsah extraktu grep