
(Y, d')
macOSのzshターミナルウィンドウで、現在のディレクトリから始まるすべてのファイルのすべてのインスタンスを再帰的に置き換えようとしています\opair{Y, d'}
。.tex
以下は何もしないようです。
find . -type f -name "*.tex" -print0 | xargs -0 sed -i '.bak' -e "s/(Y, d')/\\opair{Y, d'}/g"
どうすれば解決できますか?
脱出しようとしましたが'
(私はこの記事によると、sed
脱出は実際には必要ありません)、問題は解決されませんでした。
答え1
find . -name '*.tex' -type f -exec \
sed -i.bak -e "s/(Y, d')/\\\\opair{Y, d'}/g" {} +
- あなたは
X
代わりにY
xargs
標準構文が利用可能な場合は-exec cmd {} +
必要ありません。\
シェルエスケープが必要です(二重引用符ではまだ特別です)。または or in または in after をsed
実行できます。これはシングルでは特別ではありません(もちろん、質問はsをに渡す方法に移動します)。's/(Y, d'\'')/\\opair{Y, d'\''}/g'
rc
zsh
set -o rcquotes
's/(Y, d'')/\\opair{Y, d''}/g'
\
'
sed
- forは
find
通常-name
テストよりも安いので、最初に置くことを-type
お勧めします(find
一部の実装では最適化のために独自に並べ替えますが)。 - FreeBSD以外の実装(Macosでも同様)の場合は、
sed
バックアップサフィックスをこの-i
オプションに追加する必要があります。 FreeBSD と macos では、 と が両方-i .bak
動作します-i.bak
が、FreeBSD/macos は今後他の実装と一致することを選択できるため、後者がより移植性に優れ、将来志向的です。
また、同じように見えるキャラクターが多く、一部のキャラクターは見えません(一部制御キャラクター含む)。たとえば、Y,
との間のスペースがd'
改行されていないスペース(U + 00A0)ではなくASCIIスペース(U + 0020)であることを確認してください。それとも'
U + 2019の代わりにASCIIアポストロフィ(正しい引用)ですか?
inはカーソルの下にある文字に関する情報をvim
提供します。入力の各文字名を提供します。ga
uconv -x name < file
reveal() {
perl -Mcharnames=full -Mopen=locale -pe 's{[^\t\n -~]}{
sprintf "<U+%04X %s>", ord($&), charnames::viacode(ord($&))}ge' "$@"
}
使用することができる明らかにする(例)スペース、タブ、改行、ASCII印刷可能文字以外の文字<U+3000 IDEOGRAPHIC SPACE>St<U+00E9 LATIN SMALL LETTER E WITH ACUTE>phane
。 Stéphane
また、一部のfind
実装(find
GNUシステムのGNUを含む)では終わりますが、残りは現在のロケールの文字でデコードできないファイル名を-name '*.tex'
一致させることができない場合があります。たとえば、0xe9バイトだけでは文字としてデコードできないため、文字エンコードとしてUTF-8を使用するロケールから呼び出されたファイルを.tex
スキップします。$'St\xe9phane'
コマンドをプレフィックスとして使用すると、LC_ALL=C
この問題を解決できます。