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.
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 grep
akzeptiert wird (wie in , wo einem wörtlichen entspricht ).\|
|
egrep
\|
|
Abgesehen davon weist Ihr Ausdruck noch weitere Probleme auf: -
+
egrep
wird nur in (oder ) unterstütztgrep -E
.\s
wird 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 egrep
eine {}
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 grep
könnte zu komplex sein.
Hier verwende ich sed
und awk
um es zu extrahieren, ist der Befehl
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp