grep с регулярным выражением, содержащим символ вертикальной черты

grep с регулярным выражением, содержащим символ вертикальной черты

Я пытаюсь выполнить grep с регулярным выражением, содержащим символ вертикальной черты |. Однако, это не работает так, как ожидалось. Регулярное выражение не соответствует инклюзивности, |как показано на прикрепленном изображении ниже.

введите описание изображения здесь

это моя команда bash

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

пример данных следующий

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

ожидаемый результат

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

Однако, проверив это с помощьюRegex101.com, результат получился таким, как и ожидалось.

решение1

Похоже, что grepпринимает \|в качестве разделителя между альтернативными поисковыми выражениями (например , |в egrep, где \|соответствует литералу |).

Помимо этого, в вашем выражении есть и другие проблемы:-

  • +поддерживается только в egrep(или grep -E).
  • \sне поддерживается внутри []группы символов.
  • Я не вижу необходимости |в группе персонажей.

Итак, следующее работает для grep:

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

Или (благодаряГленн ДжекманВвод):-

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

В egrepсимволах {}есть особое значение, поэтому их нужно экранировать:-

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

Обратите внимание, что я удалил ненужное использование cat.

решение2

Похоже, ваш запрос заключается в извлечении строки, содержащей flag|, использование grepmay слишком сложно.

Здесь я использую sedи awkдля его извлечения, команда

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

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

Связанный контент