Назад | Перейти на главную страницу

Regex для sed, чтобы захватить несколько строк или лучший способ?

Я создаю сценарий, который подключается к серверу и выгружает вывод во временный файл. Я хочу использовать sed в сценарии, чтобы получить конкретную информацию из временного файла. На выходе всегда будет пунктирная линия из 80 символов, затем информация, которую я хочу, за которой следует оператор Disconnected.

У меня работает регулярное выражение, если это была всего лишь одна строка, проблема в том, как мне сгруппировать новые строки?

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

-\{80\}[\r\n]*\(.*\)[\r\n]\{4\}Disconnected

файл

...
--------------------------------------------------------------------------------
The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.

Disconnected ...

Желаемый результат

The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.

Сначала используйте флаг '-n', чтобы подавить автоматический вывод. Далее используйте sed адреса цитировать интересующую вас часть (от тире "---" до строки со словом "Disconnected"). Наконец, распечатайте пространство шаблонов (все пространство шаблонов, поскольку вас интересует все, что внутри него).

~$ sed -n '/^---*/,/Disconnected/{p}' inputfile

Отредактировано из-за запроса LF4 на удаление из результата строчки с тире.

С помощью «адресов» вы указываете отдельные пространства шаблонов. Таким образом, вы можете делать все, что захотите, с этими отдельными пространствами шаблонов. В том числе удалить строки по регулярному выражению. В этом примере команда удаляет строки, образованные дефисами, из пространства шаблонов, давая результат, который вы ищете:

~$ sed -n '/^---*/,/Disconnected/{/^---*/d;p}' inputfile

HTH

sed можно искать шаблон в нескольких строках, объединив их в которые называется «удерживаемым пространством», примерно так:

$ sed -n '1h;1!H;${;g;s/.*\(-\{80\}.*Disconnected\).*/\1/p;}' file
  • 1h: скопируйте первую строку, чтобы удерживать пробел
  • 1!H: со второй строки добавить, чтобы удерживать пробел
  • $: последняя строка
  • g: скопировать удерживаемое пространство в буфер шаблона
  • s/pattern/substitution/: поиск и замена
  • \1: обратная ссылка на группу в шаблоне
  • p: Распечатать

Самый простой, но не очень эффективный способ -

  1. Используйте tr, чтобы удалить все символы новой строки.

    tr '\n' ' '
    
  2. Повторно добавить новые строки после Disconnected с помощью sed \a команда.

  3. Разберите эти данные, используя свой sed команда.