Возникли трудности с использованием регулярного выражения в grep

#regex #grep

#регулярное выражение #grep

Вопрос:

Вероятно, я упускаю что-то действительно очевидное, но у меня есть XML-файл, который мне нужно просмотреть, чтобы увидеть, содержит ли он это:

<phone>null</phone> или <phone></phone>

В любом случае и с любыми дополнительными пробелами (между тегами).

Итак, мое нерабочее решение заключается в следующем:

 grep -i "<phone>s*(null)?s*</phone>" ./myfile.xml
  

Но это возвращает пустое значение (даже если файл, который я использую, имеет этот узел).
Что я упускаю из виду?

TIA

Комментарии:

1. Если вы вводите то, что у вас есть, тогда ваше регулярное выражение должно работать. Я протестировал ваше регулярное выражение с помощью grep, и оно совпало в обоих случаях.

2. да… Мне пришлось добавить -P, мой сервер не должен быть настроен на использование регулярного выражения perl по умолчанию … недостаточно знаю об этом, чтобы размышлять дальше.

Ответ №1:

Ах! Нашел это… Я отвечу на это сам на случай, если кто-нибудь еще сочтет это полезным в будущем … добавив -P переключатель ie…

 grep -i -P "<phone>s*(null)?s*</phone>" ./myfile.xml
  

…для вызова он использует regex в стиле perl (который я использую) и выдает желаемый результат.

Ответ №2:

 kent$  echo "<phone>null</phone> or <phone></phone>foo bar"|grep -iE "(<phone>null</phone>|<phone></phone>)"                             

<phone>null</phone> or <phone></phone>foo bar
  

Комментарии:

1. Кент, я понял это, спасибо… но ваше решение не использует регулярные выражения и не проверяет наличие возможных пустых мест вокруг (вместо) null. Хотя спасибо.