ファイルを2つの変数に分割してコマンドにパイプ

ファイルを2つの変数に分割してコマンドにパイプ

JSONオブジェクトがあります。 2つのフィールドがあります{ href: string, filename: string }。 hrefからファイルをダウンロードして名前をに設定したいと思います$FILENAME.pdf。この問題は繰り返し発生します。

どうすればいいですか?常に構文を見つける必要があるので、ループがないことをお勧めします。

私は次のことを想像しています:cat files.json | jq-like-splitter '.href' '.filename' | wget $HREF -o $FILENAME.pdf

答え1

xargs小さなシェルスクリプトを使用して起動できます。

jq -r '.href, .filename' file.json | xargs -n2 sh -c 'wget "$1" -O "$2"' sh

wgetオプションは-oログファイルと-O「出力文書」に適用されます。

答え2

ソリューションに似ていますxargsparallel。使用すると、
パイプや追加の呼び出しが不要なので、よりエレガントだと思いますsh

parallel -n2 wget {1} -O {2} ::: "$(jq -r '.href, .filename' file.json)"

答え3

Linuxのjq-splitterについてはわかりませんが、sedを使用してフィールドを分割し、出力を変数として読み取ってwgetを実行できます。

$> read HREF FILENAME < <(sed -r 's/(.*href:[ ]*)([^, ]*)(.*filename:[ ]*)([^, ]*)(.*)$/\2 \4/' files.json);wget "${HREF}" -o "${FILENAME}.pdf"

sedこのオプションを使用すると、-r正規表現を有効にしてキャプチャグループを作成し、hrefの前のすべての項目を解析し、その値を取得できます。次に、ファイル名の前のすべての項目をインポートし、その値をインポートします。キャプチャグループ1と4のスペースで区切られた出力を印刷します。

値を読み取ったHREF後、FILENAMEセミコロンは、保存された値でwgetを実行する別のコマンドを開始します。

関連情報