次のことは可能ですか?
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_PATTERN
l
だから
setopt histsubstpattern
それではうまくいくでしょう...