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.
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 grep
acepta \|
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 enegrep
(ogrep -E
).\s
no 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 egrep
personajes {}
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 grep
may es demasiado complejo.
Aquí uso sed
y awk
para extraerlo, el comando es
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp