grep com regex contendo caractere pipe

grep com regex contendo caractere pipe

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.

insira a descrição da imagem aqui

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 grepaceita \|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 em egrep(ou grep -E).
  • \snã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 egreppersonagens {}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 grepmay é muito complexo.

Aqui eu uso sede awkpara extrair, o comando é

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

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

informação relacionada