Intereting Posts
Как выполнить несколько команд с помощью nohup Добавить уведомление в mpv через notify.send? Почему я не могу читать / dev / stdout с помощью текстового редактора? Как подождать, когда USB-накопитель будет распознан / смонтирован во время загрузки, чтобы начать собственный сервис? Различное представление bash в команде «ps -f» smbd сбой после выхода из системы или неудачная попытка входа в систему Установить переменную среды для диспетчера файлов Ranger Отключение readahead с помощью hdparm или POSIX_FADV_RANDOM Как настроить grub для загрузки другого дистрибутива Linux из раздела lvm? возобновить чтение файла журнала с того места, где я его оставил в прошлый раз Как удалить количество строк из файла повторно Не удается получить доступ к доступному порталу во FreeBSD 12-CURRENT сочетание клавиш для перехода курсора к подсказке? Вывод из цикла while с корпусом переключателя внутри VmHWM только 25%, тогда как это должно быть около 80%

Как работает эта команда sed?

Я хочу понять, как работает команда sed :

 sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } 

На самом деле это часть другой команды для поиска определенного файла класса из данного списка файлов jar:

 find . -name "*jar" -print -exec jar -tf '{}' \; | grep -E "jar$|CLASS_NAME" | sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } " 

Сначала начнем с параметров командной строки:

  • -n отключает нормальный выход буфера. Будут напечатаны только строки, которые запрашиваются для печати (например, с помощью команды p )

  • -r позволяет расширенное регулярное выражение

  • -e самом деле не требуется, когда мы указываем команды sed в командной строке, а не в файле

Теперь идут команды sed. Есть два, разделенных ; персонаж. Sed идет по строкам и выполняет эти две команды по порядку. Но только если они совпадают. Здесь обе команды имеют префикс /SOMETHING/ что означает, что эта команда выполняется только в том случае, если текущая строка соответствует SOMETHING regexp.

/jar$/ regexp только соответствует, если текущая строка заканчивается jar . Аналогичный /class$/ regexp соответствует только текущей строке с class . Теперь, если определенная строка совпадает, она выполняет в ней две команды (они сгруппированы с {} ) – в первом случае это x а затем команда d . Во втором случае это x а затем команда p .

  • Команда x – это eXchange . sed имеет буфер, который вы можете использовать для хранения некоторых строк. Эта команда обменивает этот буфер с текущей строкой (так что текущая строка переходит в этот буфер, а содержимое буфера становится текущей строкой).

  • d команда отбрасывает текущую строку, считывает новую и запускает команды sed из первого (все команды после d игнорируются для текущей строки).

  • Команда p печатает текущую строку. Поскольку мы используем аргументы -n на выходе будут отображаться только строки, напечатанные с помощью p .

Итак, подведем итог:

  • /jar$/ { x; d; } /jar$/ { x; d; } означает – если текущая строка заканчивается jar , сохраните ее в буфере

  • /class$/ { x; p; } /class$/ { x; p; } означает, что если текущая строка заканчивается class , получите содержимое буфера (которое должно содержать последнюю строку, заканчивающуюся jar , если только не был файл, заканчивающийся class ) и распечатать его