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

그러면 제대로 작동할 텐데...

답변2

시도하고 다시 구현한 방법은 zmv -W매우 취약합니다.

rfn a*b*c b*c*d적용하기 전에 acrobatic로 변경해야 합니다 bcrocatid.

  • a -> b
  • b -> c
  • c->d

지속적으로, 그러나 이로 인해 다음이 생성됩니다.

  • 곡예 -> 곡예
  • 곡예 -> 곡예
  • 곡예 -> 곡예

zmv -W그냥 똑같이 하세요

  1. 역참조를 활성화 a*b*c하도록 모드 변경(#b)a(*)b(*)c
  2. b*c*d교체를 다음으로 변경하십시오 .b$match[1]c$match[2]d
  3. Korn 스타일 또는 csh-stype을 사용하여 ${var/pattern/replacement}교체를 수행 하거나 zsh 6.0+를 사용하여 교체를 수행합니다.$var:s/pattern/replacementhistsubstpattern:S수정자모드 유무에 관계없이 작동합니다 histsubstpattern.
function frn {
  emulate -L zsh
  set -o extendedglob
  local glob=$1 replacement=$2 n=0 file newfile

  pattern=${glob//'*'/'(*)'}
  replacement=${replacement//(#m)'*'/\$match[$((++n))]}

  for file ($~glob) {
    newfile=${file/#%(#b)$~pattern/${(Xe)replacement}}
    if [[ -n $newfile && $file != $newfile ]] {
      print -ru2 -- "${(q+)file} -> ${(q+)newfile}"
      # mv -- $file $newfile
    }
  }
}
alias frn='noglob frn'

그 다음에:

$ frn a*b*c b*c*d
acrobatic -> bcrocatid

그것은 다음과 같습니다:

$ alias zmvw='noglob zmv -W'
$ zmvw -n a*b*c b*c*d
mv -- acrobatic bcrocatid

zmv더 많은 와일드카드를 처리할 수 있을 뿐만 아니라 *더 많은 온전성 검사 및 오류 처리도 수행할 수 있습니다.

관련 정보