{} のような replstr とは何ですか?

{} のような replstr とは何ですか?

のドキュメントには、フラグが取るxargs「replstr」についての記述があります-I。これについて読み始めたとき、次のコマンドを実行するのを見つけましたfswatch:

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

そして、manページを読み始めましたxargs

-I replstr
        Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
        specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
        allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
        the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
        contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

「replstr」という用語について考えると、おそらく「読み取り、評価、印刷、ループ、文字列」のような意味のようですが、これはその略語でしょうか? 何をしているのか理解しようとして、いろいろ試してみました{}が、まだよくわかりません。

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

たとえば、echo {a..3}私にはまったく意味がわかりません。明らかに「この文字列のリストをここで置換する」という効果のあることを行っているようですが、それが正しい見方かどうかはわかりません。また、これが{}特定のタイプの replstr なのか、他にもあるのかどうか、あるいは replstr は単に中括弧のペアの間にあるものなのかもわかりません。replstr とそのアプローチ方法についてのガイダンスをいただければ幸いです。

答え1

replstr「置換文字列」または「置換文字列」を意味します。

元のreplstrは です。これは最初にコマンド句{}で導入され、見つかった各ファイル名に置き換えられました。例:findexec

find /tmp -name "foo*" -exec echo file {} found \;

2 つのファイルがパターンに一致すると仮定して、次のように表示されます。

file foo1 found
file foo2 found 

このxargsコマンドでは、標準入力に渡された文字列から構築された引数を使用して同じ操作を実行できるほか、{}置換文字列とは異なる文字列を指定することもできます。

デフォルトの replstr は{}中括弧内に何も入っていないことに注意してください。中括弧は、すでにお気づきの範囲やパラメータ拡張など、さまざまな目的で使用されます。

答え2

引数-Iは次のように動作します:-I whateverは、文字どおりの出現がwhateverコマンド引数に置き換えられることを意味します。デモ:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

わかりましたか? 、、のxargs各行を取り、のの代わりにそれらを置き換えました。abcfecho hey f hey f

関与はありません{}

オプション-Iは POSIX です。GNU は、として呼び出された場合、のように動作するxargs非推奨のオプションを文書化しています。 として呼び出された場合、のように動作します。この場合、 の出現は置き換えられます。は、の機能、つまりその述語に明らかに影響を受けています。-i-iwhatever-I whatever-i-I {}{}{}find-exec

およびBash 構文は{a..b}foo{a,b,c}barその「中括弧展開」によって処理されます。{}特別な意味はなく、そのままコマンドに渡されます。(そうでない場合、標準に準拠した一般的なfind呼び出しが中断されます。)

答え3

{...}シェルのブレース拡張は、 のようなリスト( 、{a,b,c}に展開されます)、および のような数値のシーケンス( 、... 、に展開されます) または文字( 、、、 ) をサポートします。(中括弧の展開は、 で使用されるプレースホルダーとは関係ありません)。abc{0..13}011213{a..d}abcd{}xargs

展開するとやや奇妙なシーケンス{a..3}になるが、これはASCII文字表aは数値ではないので、両方とも文字として扱われ、文字コードの数値によってaとの間のすべての文字が展開されます。の後に が来るので、シーケンスは大文字と 9 から 3 までの数字を下に向かって進みます。3a3

ご覧のとおり、このような範囲で文字と数字を混在させることはあまり有用ではありませんが、{a..z}または は有用かもしれません。また、正規表現やシェル グロブの{A..Z}および も同様です。(つまり、残りの文字を無視できる場合です。)[a-z][A-Z]

関連情報