grep mit regulärem Ausdruck, der Pipe-Zeichen enthält

grep mit regulärem Ausdruck, der Pipe-Zeichen enthält

Ich versuche, mit einem regulären Ausdruck zu greppen, der ein Pipe-Zeichen enthält |. Es funktioniert jedoch nicht wie erwartet. Der reguläre Ausdruck stimmt nicht mit dem |Inklusiven überein, wie im unten angehängten Bild zu sehen ist.

Bildbeschreibung hier eingeben

das ist mein Bash-Befehl

cat data | grep "{{flag\|[a-z|A-Z\s]+}}"

Die Beispieldaten sind die folgenden

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066
|{{flagicon|Kosovo}} ''[[Kosovo]]'' <ref name="KOS" group=Note>{{Kosovo-note}}</ref>
|{{flagicon|Somaliland}} [[Somaliland|Somaliland region]]
|{{flagicon|Palestine}} ''[[Palestinian Territories]]''{{refn|See the following on statehood criteria:

Die erwartete Ausgabe ist

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066

Aber nachdem ich es getestet habe mitRegex101.com, das Ergebnis fiel wie erwartet aus.

Antwort1

Es scheint, dass als Trennzeichen zwischen alternativen Suchausdrücken grepakzeptiert wird (wie in , wo einem wörtlichen entspricht ).\||egrep\||

Abgesehen davon weist Ihr Ausdruck noch weitere Probleme auf: -

  • +egrepwird nur in (oder ) unterstützt grep -E.
  • \swird innerhalb einer []Zeichengruppe nicht unterstützt.
  • Ich sehe keine Notwendigkeit für |die Zeichengruppe.

Folgendes funktioniert also für grep: -

grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp

Oder (danke anGlenn Jackman's Eingabe):-

grep "{{flag|[a-zA-Z ]\+}}" <temp

Die Zeichen haben egrepeine {}besondere Bedeutung und müssen daher maskiert werden: -

egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp

Beachten Sie, dass ich die unnötige Verwendung von entfernt habe cat.

Antwort2

Es scheint, dass Ihre Anfrage darin besteht, die Zeile zu extrahieren flag|, die enthält. Die Verwendung von grepkönnte zu komplex sein.

Hier verwende ich sedund awkum es zu extrahieren, ist der Befehl

sed -r -n '/flag\|/p' /tmp/temp

awk 'match($0,/flag\|/){print}' /tmp/temp

verwandte Informationen