ここで説明されている元の問題は次のとおりです:- 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 を使用する基本的な考え方は理解していますが、次のことがどのように実現されているのか理解できません。
- 置換するには、任意のパターンを に解決します。
- 代替となる任意のパターンを生成します。
また、ここでの eval() との結合は私たちには理解できません。さらに、# の使用法が 3 つありますが、これも私たちには理解できません。
助けてください。ありがとうございます。
答え1
まず、あなたが言及していないので、これは bash スクリプトであると想定しています。
これら 2 行の要点は、 の出力からタイトル番号と章番号を抽出し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))
あなたも構文に混乱していると思います$((10#x))
。 内訳は次のとおりです。$((expression))
bash では は「expression
算術式として扱い、評価する」という意味ですが、 は「基数としてy#x
扱い、10 進数に変換する」という意味の算術式です。 たとえば、は(10 は基数 2 では 2 を表すため) と評価され、 は(基数 10 の数値を 10 進数に変換しても何も起こらないため)と評価され、エラーが発生します (「4」は基数 3 では有効な記号ではないため)。のセクションから詳細情報を入手できます。x
y
2#10
2
10#10
10
3#4
ARITHMETIC EVALUATION
man bash
したがって、sed
コマンドは次のような文字列を出力します。cells[$((10#x))]=$((10#y))
ここでx
、 とy
は数値です。これは に渡されますeval
。この時点で、算術式を評価した後の文字列は のようになるため、この文字列を評価すると bash の標準的な配列割り当てになるだけであることがおわかりいただけると思いますcells[x]=y
。
最後の行は単なる追加の変数割り当てですが、1 つのトリックがあります。配列${#cells[@]}
内の項目の数を評価するだけですcells
。
それが要点です。