ここに記載されている元の質問に従って:- 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
が、算術式では「x
基数で扱ってy
十進数に変換する」という意味だ。たとえば、10は2進数で2を表すため、次のように評価され、2#10
10進数を10進数に変換すると何もしないので評価されます(「4」は3進数で有効な記号ではないため)。発生します。詳細はセクションで確認できます。2
10#10
10
3#4
ARITHMETIC EVALUATION
man bash
したがって、sed
コマンドは次の文字列を出力します。ここで、cells[$((10#x))]=$((10#y))
数字は数字です。これはに渡されます。算術式を評価した後、文字列は次のようになるため、この文字列を評価するとbashで標準の配列割り当てが発生することを十分に知っています。x
y
eval
cells[x]=y
最後の行は単なる追加変数の割り当てです。ここにはトリックがあります。${#cells[@]}
配列内の項目数のみを計算しますcells
。
それがまさに鍵です。