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

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

このフラグによって取られた「replstr」への言及はドキュメントにxargsあります。-I私は次のコマンドを実行したいと思ったときにそれを読み始めましたfswatch

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

そしてマニュアルページを読み始める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 \;

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

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各行abおよびを取得してincに置き換えます。fecho hey f hey f

無関係{}

この-IオプションはPOSIXです。 GNUは、呼び出されると..のように動作する廃止されたxargsオプションを文書化します。直接呼び出すと..のように動作します。この場合、発生項目が置き換えられます。明らかに、次の機能に触発されました。対応する述語。-i-iwhatever-I whatever-i-I {}{}{}find-exec

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

答え3

{...}はいシェル支柱の拡張はリスト(、、および{a,b,c}で拡張)と数値シーケンス(数字、...、、、で拡張)または文字(、、、、)をサポートします。 (角かっこ拡張は使用されたプレースホルダとは無関係です)。abc{0..13}011213{a..d}abcd{}xargs

やや奇妙な順序で{a..3}拡張ASCII文字テーブルa数値ではないため、両方とも文字として扱われ、a文字コードの数値の内と間のすべての文字に展開されます。偶然後に出る3ので大文字と数字9~3を経て順番が下がります。a3

ご覧のとおり、この範囲内の文字と数字を混在させることはあまり役に立ちませんが、類似しており、正規表現やシェルグローバル変数には役立ちます{a..z}。 (つまり、残りの文字を無視できる場合です。){A..Z}[a-z][A-Z]

関連情報