是否可以执行以下操作?
g=$f:s/$in/$out/;
或者
g=$g:s/$in[$i]/$out[$i]/;
我尝试过随机字符组合,例如${~in}
和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='setopt noglob; frn'
function frn() {
local in out m n f g i;
setopt glob histsubstpattern; # changes shell's options
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 = 0; i < $n; i += 1 )); do
g=$g:s/$in[i]/$out[i]/; # subst corresponding fields
done;
print '$f --> $g'
mv $f $g;
end;
} else {
print "n(*) must be same for both patterns";
}
}
$out
与展开的不同,$in
这里被视为文字字符串......所以什么也没有发生(除非字面f
包含$in
)。要在左侧展开,您需要
HIST_SUBST_PATTERN
设置:所以
然后它应该可以工作......