計算とスクリプト制御に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()との組み合わせは私たちの範囲外です。さらに、#には私たちが知らない3つの異なる用途があります。

助けてください。ありがとうございます。

ベストアンサー1

まず、あなたが言及していないので、これがbashスクリプトであると仮定します。

これらの2行の概要は、出力からタイトル番号と章番号を抽出して名前付き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十進数に変換する」という意味だ。たとえば、10は2進数で2を表すため、次のように評価され、2#1010進数を10進数に変換すると何もしないので評価されます(「4」は3進数で有効な記号ではないため)。発生します。詳細はセクションで確認できます。210#10103#4ARITHMETIC EVALUATIONman bash

したがって、sedコマンドは次の文字列を出力します。ここで、cells[$((10#x))]=$((10#y))数字は数字です。これはに渡されます。算術式を評価した後、文字列は次のようになるため、この文字列を評価するとbashで標準の配列割り当てが発生することを十分に知っています。xyevalcells[x]=y

最後の行は単なる追加変数の割り当てです。ここにはトリックがあります。${#cells[@]}配列内の項目数のみを計算しますcells

それがまさに鍵です。

おすすめ記事