пытаясь понять вложенные скобки в сценарии sed - PullRequest
3 голосов
/ 11 марта 2011
/^Host.*latency.*/{
    $!N
    /MAC Address/{
        s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/
    }
}  
/[Nn]map/d
s/^Host .*is up/& but MAC Address cannot be found/

Я пытаюсь понять сценарий sed, как указано выше. Может кто-нибудь помочь мне понять, что я никогда не использовал sed, как указано выше. Его использование составляет

nmap -sP 192.168.1.0/20 | sed -f sedcript.sh

1 Ответ

3 голосов
/ 11 марта 2011

Если вы имеете в виду вложенные скобки в (\(.*\)). Внешняя пара буквальная, а внутренняя, экранированная пара захватывает строку, совпадающую с вложенным регулярным выражением. Обратная ссылка \1 выводит эту захваченную строку. Обратная ссылка \2 выводит строку, захваченную второй парой экранированных скобок.

Если вы имеете в виду фигурные скобки, они окружают блоки команд. Внешняя группа говорит, что если строка соответствует ^Host.*latency.*, то выполните вложенную команду. Команда $!N добавляет следующую строку файла, если текущая строка не последняя. Если комбинация строк соответствует MAC Address, то выполняется блок внутри следующей пары фигурных скобок (выполняется подстановка).

Вы можете прочитать это так:

  • /^Host.*latency.*/{ - Если строка соответствует этому регулярному выражению, то
    • $!N - добавить следующую строку, если текущая строка не является последней строкой
    • /MAC Address/{ - Если объединенные строки соответствуют этому регулярному выражению, то
      • s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/ - сделать эту замену
    • } - Конец, если
  • } - Конец, если
  • /[Nn]map/d - Если пространство шаблона (комбинированные линии) соответствует этому, то удалите его
  • s/^Host .*is up/& but MAC Address cannot be found/ - сделать эту замену
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...