É possível fazer algo como o seguinte?
g=$f:s/$in/$out/;
ou
g=$g:s/$in[$i]/$out[$i]/;
Eu tentei combinações aleatórias de caracteres como ${~in}
e g=$g:ps/
mas, como você pode ver, não sou um especialista em zsh - e adivinhar não está me levando a lugar nenhum :-) Eu até tentei ler as páginas de manual ...
EDIT: Estou tentando escrever meu próprio comando do tipo 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";
}
}
Ao contrário
$out
de which é expandido,$in
é tratado como uma string literal aqui... então nada acontece (a menos quef
esteja contido$in
literalmente).Para expandir no lado esquerdo você precisa
HIST_SUBST_PATTERN
set :Então
e então deve funcionar ...