Zsh:変数値を代替パターンとして使用できますか?

Zsh:変数値を代替パターンとして使用できますか?

次のことは可能ですか?

g=$f:s/$in/$out/;

または

g=$g:s/$in[$i]/$out[$i]/;

${~in}私はandのようなランダムな文字の組み合わせを試しましたが、g=$g:ps/私はzshの専門家ではありません。推測は何らかの形で私には役に立ちません。 :-) マンページを読んでみました...

編集:独自のzmv型コマンドを作成しようとしています。

# in   a*b* -> a b NULL     rn a*b* *c*d   aXXbYY  -->  XXcYYd
# out  *c*d -> NULL c d     rn inv* mag*   inv.ext inv.spc -->  mag.ext mag.spc

alias rn='noglob frn'

function frn() {                                                                                                   
    local in out m n f g i
    setopt localoptions glob histsubstpattern

    in=("${(@s:*:)1}")                          # split $1 and $2 on '*'
    out=("${(@s:*:)2}")                         # keeping NULL fields

    m=${#in[@]}                                 # count n(array-elements)
    n=${#out[@]}

    if [[ $m = $n ]] {
        foreach f ($~1)                         # foreach file in globbed $1
            g=$f
            for (( i = 1; i < n; i += 1 )); do
                g=$g:s/$in[$i]/$out[$i]/        # subst corresponding fields
            done

            g=$g:s/%$in[$i]/$out[$i]/           # last subst has % anchor

            print '$f --> $g'
            mv $f $g
        end
    } else {
        print "n(*) must be same for both patterns"
    }
}

ベストアンサー1

$out拡張とは異なり、$inこれはリテラル文字列として扱われるため、何も起こりません(リテラルがf含まれていない限り$in)。
左に展開するには、次のものが必要です。HIST_SUBST_PATTERN置く:

s/l/r[/]

r以下の説明に従って交換してくださいl
...
デフォルトでは、置換の左側はパターンではなく文字列です。 [...]
...このオプションが設定されている場合、
ファイル名生成フォームパターンに記載されているように通常どおりに処理されます。HIST_SUBST_PATTERNl

だから

setopt histsubstpattern

それではうまくいくでしょう...

おすすめ記事