Как работает эта команда 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; } " 

One Solution collect form web for “Как работает эта команда sed?”

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

  • -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 ) и распечатать его

  • Ссылка на переменные массива bash из другого массива
  • Передайте значение для приглашения ввода
  • Фильтрация входов в текстовый файл
  • Grep для нескольких строк, покажите количество строк после одной из строк (но не другой)
  • Как инвертировать счет, возвращенный из grep?
  • Как запросить ввод от пользователя из переменной или массива bash?
  • Как использовать регулярное выражение в sed?
  • Как создать выход в скрипт python, запущенный при загрузке?
  • shell-скрипты и запуск после переключения на другого пользователя
  • скрипт меню через ssh
  • Задача SED, агрегирование строки, содержащей фигурные скобки
  • Interesting Posts

    Альтернатива Perl для экрана / tmux для мира UNIX?

    Монтаж внутри смонтированного только для чтения объема

    Найти лучший шрифт для рендеринга codepoint

    Есть ли недостаток при использовании chroot в высокопроизводительных вычислениях?

    DD-WRT: dhcp6c не получает новый адрес для ppp0

    Не удалось расширить размер логического тома LVM

    Как я могу безопасно удалить диск SATA из работающей системы?

    Запуск программы (команды) на терминале после экрана входа в Ubuntu 14.04

    Заменить рабочий каталог на 2 терминала одновременно

    Как ввести символ табуляции в vim с включенным плагином SuperTab?

    Каким образом RHEL / centos отличается от Fedora пакетным / релевантным пользователю?

    Получение относительных связей между двумя путями

    Iptables переадресация нескольких портов на основе адреса назначения

    mutt после запроса пароля, используемого как для imap, так и для smtp

    Разрешения на файлы изменены после SFTP

    Linux и Unix - лучшая ОС в мире.