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

おすすめ記事