今まで使ってきておいて今更?感ありますけど
command1 a(command2)b
のようにすると () の中が command2 の出力を行ごとに置き換えたものになって command1 のコマンドライン引数になります
例えば a.txt に foo,bar,baz の 3 行を入れておき Node.js で引数を配列形式で表示してみると
> cat a.txt
foo
bar
baz
> node -p "process.argv.slice(1)" aaa(cat a.txt)bbb
[ 'aaafoobbb', 'aaabarbbb', 'aaabazbbb' ]
スペースを含めたい場合に "" で全体を囲むと () の中身が文字列扱いでコマンド実行されないので () の前後に "" を書きます
> node -p "process.argv.slice(1)" (cat a.txt)" xyz"
[ 'foo xyz', 'bar xyz', 'baz xyz' ]
連番のファイルをここからここまでで指定して消すのにも使えますね
seq コマンドを使うとこういう結果を得られるので
> seq -w 88 102
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
こういうコマンドで 088.jpg ~ 102.jpg というファイルを削除できます
> rm (seq -w 88 102).jpg
また * とも組み合わせられるので こういうファイルリストがあったときに
01-foo.txt
02-bar.txt
02-bar.html
03-baz.txt
03-baz.js
04-qux.txt
01 ~ 03 の .txt ファイルだけを指定したい場合にはこう書けます
> echo (seq -w 03)*.txt
01-foo.txt 02-bar.txt 03-baz.txt
似た感じの展開で {} を使って「,」区切りで書いた文字列を展開する機能もあります
> echo tmp{0,1,2}
tmp0 tmp1 tmp2
これは bash でも使えて以前から使うことはあったのですが () を使ってコマンドの出力を展開する機能は bash だとシンタックスエラーでした
shell の機能としてないのかもです
xargs でできそうと思いましたが 各行の前後に固定のテキストを追加しないといけないですし 私が知る限りでは fish ほど簡単にはできなそうでした