macOSでは、zmvを使用してファイル名の二重引用符( ")をアンダースコア(_)に置き換えたいのですが、zshexpnを使用して "を適切に区切ることはできません。使用する必要がある魔法のzsh/zmv/zshexpnオプションはありますか?
% zmv -n '(**/)(*)' '$1${(S)2//"/_}'
zmv: syntax error in replacement
% zmv -n '(**/)(*)' '$1${(S)2//\"/_}'
zmv: syntax error in replacement`
% zmv -n '(**/)(*)' '$1${(Sp)2//\"/_}'
zmv: syntax error in replacement
(これは違法文字を置き換えるための大規模なキャンペーンの一部です。すべての操作を実行するためにzmv式を使用したいと思います。)
助けてくれてありがとう。
答え1
2番目の式を正確に処理する方法がわかりませんが、zmv
変数を使用して引用符を含めるとうまくいくようです。
quote='"'
zmv -n '(**/)(*)' '$1${2//$quote/_}'
例:
% find
.
./bar
./bar/Hello, "World".
% zmv -n '(**/)(*)' '$1${2//$quote/_}'
mv -- 'bar/Hello, "World".' 'bar/Hello, _World_.'
答え2
私のテストではzmv '* *' '$f:gs/"/_'
うまくいきます。
https://zsh.sourceforge.io/Intro/intro_2.htmlは非常にファイルワイルドカードの無意味な説明です。正規表現と同じではありませんが、混乱するほど近いです。
答え3
これは構文解析エラーです...関数を編集し、zmv
Stéphaneが述べた次2> /dev/null
の項目を削除するとg=${(Xe)repl}
ここ追加のエラーメッセージが表示されます。
zmv:257: parse error
zmv: syntax error in replacement
zsh
私は次がうまくいくので、閉じる二重引用符を期待して解析エラーが発生したと推測します。
zmv -n '(**/)(*)' '$1${2//"\""/_}'