grep con expresiones regulares que contienen carácter de tubería

grep con expresiones regulares que contienen carácter de tubería

Estoy intentando buscar con expresiones regulares que contengan un carácter de tubería |. Sin embargo, no funciona como se esperaba. La expresión regular no coincide con |inclusive como se ve en la imagen adjunta a continuación.

ingrese la descripción de la imagen aquí

este es mi comando bash

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

los datos de muestra son los siguientes

| 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:

el resultado esperado es

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

Sin embargo, habiéndolo probado conRegex101.com, el resultado fue el esperado.

Respuesta1

Parece que grepacepta \|como separador entre expresiones de búsqueda alternativas (como |en egrep, donde \|coincide con un literal |).

Aparte de eso, tu expresión tiene otros problemas:-

  • +solo se admite en egrep(o grep -E).
  • \sno es compatible dentro de un []grupo de personajes.
  • No veo la necesidad |en el grupo de personajes.

Entonces lo siguiente funciona para grep: -

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

O (gracias aGlenn Jackmanentrada de):-

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

Los egreppersonajes {}tienen un significado especial, por lo que es necesario escapar de ellos: -

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

Tenga en cuenta que he eliminado el uso innecesario de cat.

Respuesta2

Parece que su solicitud es extraer la línea que contiene flag|, usar grepmay es demasiado complejo.

Aquí uso sedy awkpara extraerlo, el comando es

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

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

información relacionada