Jag försöker förstå skillnaden mellan grep -e och grep -E. Nu från grep manpage fick jag:

-E, –extended-regexp

Tolk PATTERN som ett utökat reguljärt uttryck (se nedan).

-e PATTERN, –regexp = PATTERN

Använd PATTERN som mönster; användbart för att skydda mönster som börjar med –

Förklaringen ovan är inte meningsfull för mig.

Så, kan någon förklara det för jag använder examples vad är skillnaden mellan de två och när ska jag använda vilket alternativ.

PS: Version: grep (GNU grep) 2.10

Kommentarer

  • Se även: unix.stackexchange.com/questions/17949/…
  • Syftet med -e är egentligen bara att göra det otydligt när en regex börjar med en streck. Så grep ---foo ger unrecognized option: ---foo men du kan säga grep -e ---foo till grep för det reguljära uttrycket ---foo.

Svar

-e är strikt flaggan för att ange det mönster du vill matcha mot. -E styr om du behöver undvika vissa specialtecken.

man grep förklarar -E det lite mer:

 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å detta är anledningen när Jag gör echo "hello" | grep -o -e 'h|l' Jag får ingen effekt eftersom | tappade sin speciella betydelse och när jag echo "hello" | grep -o -E 'h|l' Jag får önskad effekt.
  • Ja. echo "hello" | grep -o -e 'h' -e 'l' fungerar om du vill kasta -E i det här fallet.
  • grep -e -o 'h|l' matchar bokstavligen h|l medan grep -e -o 'h\|l' matchar h eller l och med -E det ' är tvärtom
  • @ronnie it ' s olyckligt att du behöver 200+ rykte för att " -funktionen " ska följa dig mellan SE-webbplatser …

Svar

Även grep -e gör det möjligt att använda flera strängar för att söka: "grep -e "abc" -e "def" -e "123" söker efter någon av de tre av dessa strängar: abc samt def och 123.

Detta fungerar ganska likt grep "abc\|def\|123" där \| står för or men c skulle vara lite tydligare att läsa.

Eftersom de viktigaste fakta om grep -E redan förklaras här, vill jag bara lägga till det jag sammanfattade om detta ämne på en ganska liknande fråga: Regeluttryck för att hitta dubbeltecken i Bash

Svar

se nedan

/ utökad

grep förstår tre olika versioner av syntax för reguljära uttryck: ”grundläggande”, ”utökad” och ”perl.” I GNU grep är det ingen skillnad i tillgänglig funktionalitet mellan grundläggande och utökade syntaxer. I andra implementeringar är grundläggande reguljära uttryck mindre kraftfulla. Följande beskrivning gäller utvidgade reguljära uttryck; skillnader för grundläggande reguljära uttryck sammanfattas efteråt. Perl-reguljära uttryck ger ytterligare funktionalitet och dokumenteras i pcresyntax (3) och pcrepattern (3), men kanske inte är tillgängliga i alla system.

Så , ännu en gång.

I GNU grep är det ingen skillnad i tillgänglig funktionalitet mellan grundläggande och utökade syntaxer

Kommentarer

  • -funktionaliteten är densamma mellan grundläggande och utökad men syntaxen är något annorlunda. regexp specialtecken som (, ), | etc måste back-snedsträckt till har sin speciella betydelse i grundläggande regexp, men inte i utökad (där de behöver undvikas för att behandlas som en strängbokstavlig)

Svar

Bara för att utveckla alternativet -e. -e är ofta valfritt:

grep PATTERN 

är identiskt med

grep -e PATTERN 

såvida inte, som anges i ett tidigare svar och på mansidorna, det finns flera sökmönster eller för att skydda ett mönster som börjar med bindestreck (-).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *