Использование 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 - найти строку длиной ровно n символов
  • Удалить пустые столбцы
  • разрешить все IP-адреса в выводе команды с помощью стандартных инструментов командной строки
  • Как заменить запятые на пробелы в csv, но вставляя другое количество пробелов после каждого столбца?
  • Как я могу добавить тег к началу нескольких файлов?
  • Использование sed для удаления строки или абзаца между разделителем
  • Преобразование строк в столбцы
  • Удалить пробелы после определенного символа
  • 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

    Проблема с командой promp cycling при использовании цветов и попытке поместить ветви git в командную строку

    bash не читает $ TERMINFO при входе в систему (через SSH)

    Использование tee для добавления строки в файл, а также использовать ее в качестве замены шаблона в другом файле

    LiveSub / installer от Debian 8 Jessie не загружается в режиме UEFI с 32-разрядной прошивкой UEFI

    minicom показ офлайн

    Найдите и укажите измененную дату и время файла

    Не удается получить экран входа в GUI на Debian Jessie

    Мой texinfo не указан в информации

    Обходная подпись GPG проверяет только один репозиторий

    VirtualBox: Kali Linux не работает в полноэкранном режиме после установки VBoxLinuxAdditions

    Как узнать, какой интерфейс я использую для подключения к Интернету?

    pwd для возврата текущего пути с помощью «/» в конце

    Сделать пакет rpm из дерева, совместимого с cpan?

    Удаление файлов-призраков с символами, отличными от ASCII

    VBox на безголовом сервере: установить linux без RDP

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