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

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

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 .

В этом суть.

  • Редактирование вложенного текста и определенных строк в файле с использованием сценария bash
  • Объединить следующую строку с предыдущей строкой
  • Как найти слово в файле и вставить текст на две строки ниже?
  • Добавить строку в список, используя AWK или SED?
  • В POSIX sed период (точка) соответствует новой строке в многострочном пространстве шаблонов?
  • Как вложить глобальные совпадения с sed?
  • Как я могу заменить ^ I на области вкладок в редакторе vim для .java-файла?
  • Команда sed удалила все и оставила только слова между шаблонами?
  • Техника для объединения групп последовательных линий, разделенных по шаблону
  • Как использовать адрес содержимого в sed в osx без ошибки «ожидаемый контекстный адрес»
  • Что означает ** / * (D.) В аргументах (zsh) sed?
  • использование sed для замены шаблона с помощью хэш-значений
  • Linux и Unix - лучшая ОС в мире.