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

$@もう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意味がないかもしれません。

関連情報