Jeg prøver at forstå forskellen mellem grep -e og grep -E. Nu fra grep manpage fik jeg:

-E, –extended-regexp

Fortolk MØNSTER som et udvidet regulært udtryk (se nedenfor).

-e MØNSTER, –regexp = MØNSTER

Brug MØNSTER som mønster; nyttigt at beskytte mønstre, der begynder med –

Ovenstående forklaring giver ikke mening for mig.

Så kan nogen forklare det for mig ved hjælp af examples hvad er forskellen mellem de to og hvornår de skal bruge hvilken mulighed.

PS: Version: grep (GNU grep) 2.10

Kommentarer

  • Se også: unix.stackexchange.com/questions/17949/…
  • Formålet med -e er egentlig bare at gøre det entydigt, når en regex starter med en bindestreg. Så grep ---foo giver unrecognized option: ---foo men du kan sige grep -e ---foo til at gribe efter det regulære udtryk ---foo.

Svar

-e er strengt taget flag for at angive det mønster, du vil matche. -E styrer, om du skal undslippe bestemte specialtegn.

man grep forklarer -E det lidt mere:

 Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \). Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {. GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E "{1" searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX.2 allows this behavior as an extension, but portable scripts should avoid it. 

Kommentarer

  • så dette er grunden til Jeg gør echo "hello" | grep -o -e 'h|l' Jeg får ingen output, fordi | mistede sin specielle betydning, og når jeg echo "hello" | grep -o -E 'h|l' Jeg får den ønskede output.
  • Ja. echo "hello" | grep -o -e 'h' -e 'l' fungerer, hvis du vil kaste -E i dette tilfælde.
  • grep -e -o 'h|l' matcher bogstaveligt h|l mens grep -e -o 'h\|l' matcher h eller l og med -E det ' er det modsatte
  • @ronnie det ' s uheldigt, du har brug for mere end 200 omdømme for at have, at " -funktion " følger dig mellem SE-websteder …

Svar

Også grep -e giver mulighed for at bruge flere strenge til søgning: "grep -e "abc" -e "def" -e "123" vil se efter en af de tre af disse strenge: abc samt def og 123.

Dette fungerer meget lig grep "abc\|def\|123" hvor \| til or men c ville være lidt klarere at læse.

Da de vigtigste fakta om grep -E allerede er forklaret her, vil jeg bare tilføje det, jeg opsummerede om dette emne på et ganske lignende spørgsmål: Regulært udtryk for at finde dobbelttegn i Bash

Svar

se nedenfor

/ udvidet

grep forstår tre forskellige versioner af syntaks for regulært udtryk: “grundlæggende”, “udvidet” og “perl.” I GNU grep er der ingen forskel i tilgængelig funktionalitet mellem basale og udvidede syntakser. I andre implementeringer er grundlæggende regulære udtryk mindre magtfulde. Den følgende beskrivelse gælder for udvidede regulære udtryk; forskelle for grundlæggende regulære udtryk opsummeres bagefter. Perl-regulære udtryk giver yderligere funktionalitet og er dokumenteret i pcresyntax (3) og pcrepattern (3), men er muligvis ikke tilgængelige på alle systemer.

Så , endnu en gang.

I GNU grep er der ingen forskel i tilgængelig funktionalitet mellem basale og udvidede syntakser

Kommentarer

  • funktionaliteten er den samme mellem grundlæggende og udvidet, men syntaksen er lidt anderledes. regexp specielle tegn som (, ), | osv. skal slås backslash til har deres specielle betydning i grundlæggende regexp, men ikke i udvidet (hvor de skal undslippes for at blive behandlet som en streng bogstavelig)

Svar

Bare for at uddybe indstillingen -e. -e er ofte valgfri:

grep PATTERN 

er identisk med

grep -e PATTERN 

medmindre der som angivet i et tidligere svar og på mandsiderne er flere søgemønstre eller for at beskytte et mønster, der begynder med en bindestreg (-).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *