Я пытаюсь выполнить 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|
, использование grep
may слишком сложно.
Здесь я использую sed
и awk
для его извлечения, команда
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp