Использование 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 () находится вне нас. Кроме того, существует три варианта использования #, которых мы просто не получаем.

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

  • Как я могу разобрать xml-файл с URL-адреса http без загрузки файла и распечатать нужную строку?
  • Как извлечь первое целое из текстовой строки в столбце файла с разделителями табуляции?
  • Oneliner для определения переменных верблюда
  • Комментировать все строки из последней прокомментированной строки в строке с 'foo'
  • sed для ограничения столбцов до 15 символов
  • Как распознать, какой символ ASCII в шестнадцатеричном состоянии?
  • Как объединить файлы CSV
  • Как найти текст, скопировать его и вставить в следующую строку в файле?
  • 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 .

    В этом суть.

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