zsh의 단일 glob 패턴에서 접미사 제거 및 추가

zsh의 단일 glob 패턴에서 접미사 제거 및 추가

foo.md.md(이중 접미사가 붙은 이유는 분명해질 것입니다)라는 파일이 있다고 가정해 보겠습니다 .

$ print *.md(om[1]) # Get the most recent .md file
foo.md.md

$ print *.md(om[1]:r) # Strip the suffix
foo.md

$ print *.md(om[1]:r).docx # Try to add a suffix -- oops that doesn't work
zsh: no matches found: *.md(om[1]:r).docx

$ print *.md(om[1]:s/.md/.docx/) # Try another way -- also falls short
foo.docx.md

$ f=(*.md(om[1])); print ${f:r}.docx # Store it in a variable -- works but verbose
foo.md.docx

*.md(om[1]:r)새 접미사를 추가하기 전에 어떻게든 zsh가 이를 완전한 스키마로 처리하도록 할 수 있다면 모든 것이 괜찮을 것 같습니다. 또는 :s///수정자를 문자열 끝에 고정하는 방법이 있습니까 ?

이것을 달성할 수 있는 방법이 있나요?

답변1

$@또 다른 방법은 인수 확산 연산자 (일명 )를 사용하여 $argv추가 수정 과 함께 익명 함수를 사용하는 것입니다 .

(){print -r -- ${^@:r}.docx} *.md(om[1])

이렇게 하면 임시 배열 변수를 사용하는 수고를 덜 수 있습니다. 이는 여러 요소를 포함하는 경우에만 필요합니다 ^. $@이와 같은 요소의 경우 다음과 같이 단순화됩니다.

(){print -r -- $@:r.docx} *.md(om[1])

또는 @Gairfowl이 의견에서 제안한 대로:

(){print -r -- $1:r.docx} *.md(om)

잊지 마세요 --( 에도 적용됨 -). 그렇지 않으면 명령 주입 취약점이 발생할 수 있습니다! 이를 생략하는 것은 -r의미가 없을 수도 있습니다 .

답변2

:s/l/r해당 옵션을 활성화하면 수정자를 고정할 수 있는 것 같습니다 HIST_SUBST_PATTERN.

~ % print -r -- *.md(om[1]:s/.md/.docx)
foo.docx.md
 ~ % print -r -- *.md(om[1]:s/%.md/.docx)
foo.md.md
 ~ % setopt histsubstpattern
 ~ % print -r -- *.md(om[1]:s/%.md/.docx)
foo.md.docx

잊지 마세요 --( 에도 적용됨 -). 그렇지 않으면 명령 주입 취약점이 발생할 수 있습니다! 이를 생략하는 것은 -r의미가 없을 수도 있습니다 .

답변3

당신이 사용할 수있는e 글로벌 예선REPLY예를 들어 값을 변경하십시오.

print -r -- *.md(om[1]e_'REPLY=${REPLY:r}.docx'_)

잊지 마세요 --( 에도 적용됨 -). 그렇지 않으면 명령 주입 취약점이 발생할 수 있습니다! 이를 생략하는 것은 -r의미가 없을 수도 있습니다 .

관련 정보