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


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

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

Regex

-\{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.

5
2017-09-24 17:06


Источник




Ответы:


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

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

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

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

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

НТН


5
2017-09-24 18:01



Это красиво и чисто, но это также включает тире и отключенную линию. Мне нужно запустить строки = wc -l; sed -n '2; $ lines {p}', чтобы удалить их, есть способ сгруппировать команду sed. - LF4
Обратите внимание, что с помощью sed вы получаете отдельные пространства шаблонов. С ними вы можете делать все, что хотите. См. Мое редактирование. - hmontoliu
Интересно поблагодарить вас за объяснение, что я не знал о sed-адресах и о том, как они работают, мне нужно будет прочитать об этом. - LF4


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

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

4
2017-09-24 18:01



Это сработало хорошо, я изменил его, чтобы захватить только текст, исключая черточки и Отключить, а также пустую строку перед отключением и после тире. sed -n '1h; 1! H; $ {; g; s /.* (- \ {80 \} \ n (. *) \ nDсвязанный. * / \ 1 / p;}' файл - LF4
Не забудьте избежать круглой скобки с обратной косой чертой. - quanta


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

  1. Используйте tr для удаления всех строк новой строки.

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

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

1
2017-09-24 17:36