grep com expressão regular contendo caractere de canal

0

Eu estou tentando grep com regex que contém caractere de pipe | . No entanto, não funciona como esperado. O regex não corresponde ao | inclusive, como visto na imagem anexada abaixo.

esteéomeucomandobash

catdata|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 com Regex101.com , o resultado saiu como esperado.

    
por XPLOT1ON 26.09.2017 / 19:15

2 respostas

4

Parece que grep aceita \| como um separador entre expressões de pesquisa alternativas (como | em egrep , em que \| corresponde a um literal | ).

Além disso, sua expressão tem outros problemas: -

  • + é suportado apenas em egrep (ou grep -E ).
  • \s não é suportado dentro de um grupo de caracteres [] .
  • Não vejo a necessidade de | no grupo de caracteres.

Portanto, o seguinte funciona para grep : -

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

Ou (graças à entrada do Glenn Jackman ): -

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

Em egrep , os caracteres {} têm significado especial, por isso precisam ser ignorados: -

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

Note que removi o uso desnecessário de cat .

    
por 26.09.2017 / 20:33
0

Parece que sua solicitação é extrair e a linha contém flag| , usando grep may é muito complexo.

Aqui eu uso sed e awk para extraí-lo, o comando é

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

awk 'match($0,/flag\|/){print}' /tmp/temp
    
por 27.09.2017 / 09:27