Я пытаюсь 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, результат оказался ожидаемым.

2 ответа2

4

Похоже, что 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 .

0

Похоже, ваш запрос извлекается, строка содержит flag| Использование grep может быть слишком сложным.

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .