Om regulære udtryk i egrep.

Skrevet af Zeph Grunschlag

egrep er en forkortelse for “Extended Global Regular Expressions Print”. Det er et program, der scanner en specificeret fil linje for linje og returnerer linjer, der indeholder et mønster, der matcher et givet regulært udtryk.

Standardkommandoen egrep ser således ud:

egrep<flags> ‘<regularexpression>’ <filnavn>

Nogle almindelige flag er:

Nogle almindelige flag er: -c for at tælle antallet af vellykkede matches og ikke udskrive de faktiske matches, -i for at gøre søgningen case-insensitiv, -n for at udskrive linjenummeret før hver match-udskrift, -v for at tage komplementet af det regulære udtryk (dvs. returnere de linjer, der ikke matcher), og -l for at udskrive filnavne på filer med linjer, der matcher udtrykket.

Regulære udtryk findes i deres egen egrep-variant (denne er meget lig de regulære udtryk, der findes i emacs, perl osv.)

(Det græske bogstav ε (epsilon) repræsenterer den tomme streng)

En af de vigtigste forskelle mellem egrep-regulære udtryk og teoretiske regulære udtryk er, at i egrep er det tilladt at finde matches hvor som helst i strengen, mens matches i den teoretiske brug altid starter fra det første tegn i strengen og slutter ved det sidste tegn. For eksempel kan man tage strengen 000001000: I egrep giver det regulære udtryk 010 et match; det teoretiske regulære udtryk 010 matcher derimod ikke 000001000, fordi 010 og 000001000 ikke er lig med hinanden. Den teoretiske ækvivalent til egrep’s 010 er (0+1)*010(0+1)*. Hvad hvis du faktisk ønsker at tage hensyn til begyndelsen og slutningen af strenge? egrep giver dig caret-symbolet ^ til at angive begyndelsen og dollar-symbolet $ til at angive slutningen. Så egrep-ækvivalenten til det teoretiske 010 er altså ^010$ .

Et andet nyttigt egrepsymbolpar er ordgrænserne \< og \>, som henholdsvis angiver begyndelsen og slutningen af et ord.

For at angive et sæt eller et område af tegn skal du bruge parenteser. For at angive sættet skal du bruge hattesymbolet ^ som det første tegn. For eksempel

  • er mængden { a, 9, A, 0, 5 }
  • er det komplementære sæt ASCII – { a, 9, A, 0, 5 } (alt undtagen a, 9, A, 0 og 5).
  • er mængden af alle små bogstaver { a, b, c, d, …, z }
  • er mængden af alle ASCII-bogstaver undtagen de små bogstaver, tallene mellem 4 og 9 og de store bogstaver Q og R.

Et par af eksempler:

  • egrep ‘^(0|1)+ +$’ searchfile.txt

match alle linjer i searchfile.txt, som begynder med en ikke-tom bitstreng, efterfulgt af et mellemrum, efterfulgt af et ikke-tomt alfabetisk ord, som afslutter linjen

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.