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