配列の各要素の前にテキストを追加します。

配列の各要素の前にテキストを追加します。

では、zshグローバル拡張により、このPフラグを使用して各一致の前にテキストを追加できます。

$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo

配列パラメータに似たものがありますか?書くなら

items=(foo bar baz)

そのような動作を実行するために使用できるフラグはありますか?

$ print -- ${(...)items}
--file foo --file bar --file baz

ベストアンサー1

最良の答えは、変更された配列が必要なターゲットによって異なります。

  1. 質問のようにコマンドライン引数を生成する場合そして--file=foo代替フラグを許可するツールを使用しており、--file foo最も慣用的な方法は${^name}拡張形式を使用することです。

    $ items=(foo "two words" baz)
    $ print -lr -- --file=${^items}
    --file=foo
    --file=two words
    --file=baz
    

    私が実証するために使用した拡張は、print -lr3つの要素を持つ配列を作成します。これらのコマンドを呼び出すと、コマンドに3つのパラメータが表示されます。

  2. コマンドライン引数を生成するには、--fileこの例では、追加したいテキストをダミー配列に配置し、拡張形式を使用して${name:^^arrayname}引数配列と組み合わせることができます。

    $ flag=(--file)
    $ items=(foo "two words" baz)
    $ print -lr -- ${flag:^^items}
    --file
    foo
    --file
    two words
    --file
    baz
    

    これは6つの要素の配列です。この形式または(1)(またはその両方)の形式は、関連する値とともにフラグを渡すためのすべてのコマンドラインツールで許可する必要があります。

  3. 等号の代わりにスペースを使用するように (1) の方法を変更できます。

    $ items=(foo "two words" baz)
    $ print -lr -- --file\ ${^items}
    --file foo
    --file two words
    --file baz
    

    (参考にしてください。持つスペースをエスケープするにはバックスラッシュを使用し、"--file ${^items}"他の意味には二重引用符を使用します。 )これは3つの要素からなる配列ですが、各要素にスペースが含まれています。この形式のフラグを許可するコマンドラインツールはほとんどありませんが、他の種類のテキスト操作に役立ちます。

  4. ${name/pattern/repl}拡張の形を取ることもできます。パターンは#(すべての配列要素の先頭で一致する必要があることを示します)で始まる必要がありますが、そうでなければ空でなければなりません(すべての配列要素が一致し、実際に置き換えられるテキストがないように)。

    $ items=(foo "two words" baz)
    $ print -lr -- ${items/#/--file }
    --file foo
    --file two words
    --file baz
    

    これは(3)と同じ注意を持ち、そのアプローチよりも慣れていません。

これらの4つのメソッドはすべて、配列要素にスペースが含まれている場合に正しい操作を実行します(つまり、文字列をスペースに突然分割しません)。

おすすめ記事