Использование eval и sed для выполнения подсчета и управления скриптами

В соответствии с оригинальной проблемой, описанной здесь: – Рип главы DVD для разделения файлов

..может ли кто-нибудь помочь нам понять, что делает следующий код:

# count Titles, and count Cells per title. # eg. ${cell[1]} is the Count of Cells for the first title # ${cell[titles]} is the Count of Cells for the last title eval $(lsdvd | sed -n 's/Title: \([0-9]\+\), .* Chapters: \([0-9]\+\), Cells: .*/cells[$((10#\1))]=$((10#\2));/p') titles=${#cells[@]} title_num=2 from_cell=1 to_cell=${cell[title_num]} 

Мы хотели бы сделать то же самое и попытались использовать код. К сожалению, это не сработает для нас, и поскольку наше понимание ограничено, мы не можем его отладить.

Мы понимаем основную идею использования sed, но не можем понять, как это удается:

  1. Разрешите любой шаблон для замены.
  2. Произведите любой шаблон, чтобы подставить.

Кроме того, его связь здесь с eval () находится вне нас. Кроме того, существует три варианта использования #, которых мы просто не получаем.

Пожалуйста помоги. Благодарю.

  • Как заполнить конечные теги с помощью sed, awk или любой другой команды?
  • Используйте SED или AWK для перемещения строки в новый столбец и строку
  • Как я могу удалить все между двумя маркерами в файле?
  • UNIX - команда разбивать файл на несколько файлов со всеми строками для каждых 3 уникальных значений в столбце
  • Обработка текста для извлечения полей структуры
  • Как работает эта команда sed?
  • Как заменить открытые скобки с конца строки на новую строку с помощью sed?
  • Как «grep» для длины строки в заданном диапазоне?
  • One Solution collect form web for “Использование eval и sed для выполнения подсчета и управления скриптами”

    Прежде всего, поскольку вы не упомянули об этом, я предполагаю, что это сценарий bash.

    Высокоуровневый блеск этих двух строк состоит в том, что они извлекают номер заголовка и номер главы из вывода lsdvd и сохраняют их в массиве, называемом cells .

    Вероятный код не работает, потому что to_cell=${cell[title_num]} в последней строке должно быть to_cell=${cells[title_num]} .

    Вот более подробная разбивка:

    Команда sed выполняет поиск номеров, следующих за Title: и Chapters: на выходе из lsdvd . sed затем сохраняет эти числа в \1 и \2 соответственно. sed выводит строку cells[$((10#\1))]=$((10#\2)) формы cells[$((10#\1))]=$((10#\2)) , заменяя ссылки обратной косой черты на номера заголовков и глав.

    Я считаю, что вас тоже смущает синтаксис $((10#x)) . Вот разбиение: $((expression)) в bash означает «рассматривать expression как арифметическое выражение и оценивать его», в то время как y#x – это арифметическое выражение, означающее «рассматривать x как базовое число y и преобразовывать его в десятичное». Так, например, 2#10 оценивает до 2 (поскольку 10 представляет 2 в базе 2), 10#10 оценивает до 10 (поскольку преобразование базового числа 10 в десятичное не делает ничего), а 3#4 выдает ошибку (поскольку " 4 "не является юридическим символом в базе 3). Дополнительная информация доступна в разделе ARITHMETIC EVALUATION man bash .

    Поэтому команда sed просто выводит строку, которая выглядит так: cells[$((10#x))]=$((10#y)) где x и y – числа. Это передается eval . Я думаю, что вы знаете достаточно на этом этапе, чтобы понять, что оценка этой строки приводит только к стандартным присваиваниям массива в bash, так как после оценки арифметических выражений строка выглядит как cells[x]=y .

    Последняя строка – это всего лишь несколько дополнительных присвоений переменных, с одним трюком. ${#cells[@]} просто оценивает количество элементов в массиве cells .

    В этом суть.

    Interesting Posts

    Случайная ошибка в Linux

    Удаление всех старых файлов после восстановления мира на FreeBSD

    Подключите beaglebone black, запуская Debian Image 2015-11-12 на ПК через Ethernet.

    Как установить статический IP-адрес в Ubuntu

    Почему grep иногда возвращает каталоги с двумя сокращениями?

    Как поддерживать 64-битные времена на 32-битной платформе Linux

    Принудительное изменение размера окна Skype (под Gnome)

    Настройка vncserver, так что он доступен только из моего туннеля ssh

    Нет результата команды locate

    Ошибка анализа zsh после псевдонима do = …

    модуль загрузки через / etc / modules

    ip изменяется от динамического к статическому и обратно

    Чтобы защитить мои данные, полезно иметь отдельные разделы данных (вместе с отдельным домашним разделом)

    Есть ли способ запустить привилегированную команду после успешного входа в SSH (не обязательно с оболочкой или PTY)?

    Как получить выход из Nagios в файле

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