Grep ничего не возвращает - PullRequest
0 голосов
/ 16 января 2019

Мне хочется оторвать голову от стола, поэтому любая помощь приветствуется.

#!/bin/bash
echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' |  grep '(?<=10 )(\.*+\w)*+'

Теперь я знаю, что это регулярное выражение работает:

(?<=10 )(\.*+\w)*+

Потому что я могу вставить текст в https://regex101.com/ и регулярное выражение, и он находит то, что мне нужно, в качестве полного соответствия.

Почему это не работает для grep?

Редактировать, пробовал это:

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' |  grep -P '(?<=10 )(\.*+\w)*+'

Но это дает мне это:

usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]

Пытались

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' | perl -nle'print if m{(?<=10 )(\.*+\w)*+}'

Но это выводит неправильные вещи:

wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.

1 Ответ

0 голосов
/ 16 января 2019

Вы можете использовать

echo 'wahegru.com mail is handled by 1 ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.com. wahegru.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.' | \ 
  grep -o '10 [^ .]*\(\.[^ .][^ .]*\)*' | head -1 | sed 's/^10 //'

См. grep демо онлайн

Подробности

  • Опция o извлекает совпадения, найденные во входной строке
  • 10 [^ .]*\(\.[^ .][^ .]*\)* совпадения
    • 10 - буквальная подстрока
    • [^ .]* - 0+ символов кромепробел и .
    • \(\.[^ .][^ .]*\)* - 0 или более повторений
      • \. - точка
      • [^ .][^ .]* - 1 или более символов, отличных от . и пробел
  • head -1 - получает первое совпадение
  • sed 's/^10 //' удаляет исходную 10 подстроку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...