使用eval和sed進行計數和腳本控制

使用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() 的耦合超出了我們的範圍。另外,# 還有三種用途,我們也沒得到。

請幫忙。謝謝。

答案1

首先,既然你沒有提到它,我假設這是一個 bash 腳本。

這兩行的高級說明是它們從 的輸出中提取標題編號和章節編號lsdvd並將它們儲存在名為 的陣列中cells

給出的代碼可能不起作用,因為to_cell=${cell[title_num]}最後一行應該是to_cell=${cells[title_num]}.

以下是更詳細的細分:

此指令在 的輸出中搜尋和sed後面的數字。 然後將這些數字分別儲存在和中。 輸出 形式的字串,用標題和章節號替換反斜線引用。Title:Chapters:lsdvdsed\1\2sedcells[$((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))其中xy是數字。這被傳遞到eval.我想你現在已經足夠了解了,評估這個字串只會導致 bash 中的標準數組賦值,因為在評估算術表達式之後,字串看起來像cells[x]=y.

最後一行只是一些額外的變數賦值,有一個技巧。${#cells[@]}僅計算數組中的項目數cells

這就是它的要點。

相關內容