Estou tentando fazer grep com regex que contém caracteres de barra vertical |
. No entanto, não funciona como esperado. O regex não corresponde |
inclusive como pode ser visto na imagem anexada abaixo.
este é o meu comando bash
cat data | grep "{{flag\|[a-z|A-Z\s]+}}"
os dados da amostra são os seguintes
| 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:
o resultado esperado é
| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066
No entanto, depois de testá-lo comRegex101. com, o resultado saiu conforme o esperado.
Responder1
Parece que grep
aceita \|
como separador entre expressões de pesquisa alternativas (como |
in egrep
, onde \|
corresponde a um literal |
).
Além disso, sua expressão tem outros problemas: -
+
é suportado apenas emegrep
(ougrep -E
).\s
não é compatível com um[]
grupo de caracteres.- Não vejo necessidade
|
no grupo de personagens.
Portanto, o seguinte funciona para grep
: -
grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp
Ou (graças aGlenn Jackmanentrada): -
grep "{{flag|[a-zA-Z ]\+}}" <temp
Nos egrep
personagens {}
têm um significado especial, então eles precisam ser escapados: -
egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp
Observe que removi o uso desnecessário de cat
.
Responder2
Parece que sua solicitação é extrair a linha contém flag|
, usar grep
may é muito complexo.
Aqui eu uso sed
e awk
para extrair, o comando é
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp