タイトルだけ見ると何を言っているのかよくわからないかもしれませんが、要は Linux や Mac のターミナル上で以下のようなことがしたいわけです。
複数行のテキストデータから 1 行目を取り出し、その 1 行から最初の空白までの項目を curl コマンドのリクエストヘッダ指定に使用する。
1 | $ cat hoge.txt | head -n1 | awk '{print $1}' | curl -H 'Content-Type: コンテントタイプ' https://example.org/ |
ちょっと強引なサンプルですが、リクエストヘッダの「コンテントタイプ」の部分に「application/json」や「text/xml」を動的に入れたいってわけですね。
(すぐに最適なサンプルが思い付かなかった)
コマンドの最後であれば xargs を素で使うのですが、コマンドの途中の場合はどうしたらいいでしょうか。
シェルの変数に格納する
パイプで繋ぎまくって 1 行コマンドでやらずに、シェルスクリプトを書くパターンです。
一定数の処理があったり、使い回す場合はこちらの方が吉ですからね。
(エラー制御は無視してます)
1 2 3 4 | #!/bin/sh CONTENT_TYPE=`cat hoge.txt | head -n1 | awk '{print $1}'` curl -H "Content-Type:${CONTENT_TYPE}" https://example.org/ |
一時的な調査や、それほどパイプを多用しないコマンドであればワンライナーでもいいと思いますが、何度も使うならシェルスクリプトで書いておくと便利です。
もう使わないだろって思ったコマンドを history から必死に探す時ってありますしね・・・。
history の履歴はデフォルトの 1000 件から増やしておくことをオススメします(笑)

まあ、メモリをそれほど消費しないならパイプの連発でもいいですが。
どうしてもワンライナーで済ませたい
確かにコマンドの途中に差し込めなくもないよなって xargs のオプションを探していたら見つけました。
xargs の -I オプションですね(大文字のアイ)
-I replace-str
-I に続けて文字列を定義すると、その文字列が変数のように使用できます。
先ほどのいまいちなサンプルを使うとこんな感じ。
1 | $ cat hoge.txt | head -n1 | awk '{print $1}' | xargs -ICT curl -H 'Content-Type: CT' https://example.org/ |
シングルクォーテーションで囲っても CT が展開されますね。
1 2 3 4 | $ vi hoge.txt application/json text/xml |
こうしてみるとわかりやすいでしょうか。
1 2 3 | $ cat hoge.txt | head -n1 | awk '{print $1}' | xargs -ICT echo 'Content-Type: CT' Content-Type: application/json |
まとめ
今回は強引に curl を例にしましたが、最後に実行するコマンドがメインになることが多いと思います。
引数をたくさん使うコマンドの場合もあるでしょうし、1 箇所だけを動的にしたいなら使う価値はアリですね。
他にも、JSON で返ってきた内容を jq コマンドでパースして、特定の値を別のコマンドに渡したいってケースは遭遇しそうな気もする。
1 | $ curl https://example.org/ | jq -r .data[0].name | xargs -INAME sample_command. -n NAME -a hoge -b fuga |