文字列を 'に再帰的に置き換えるには?

文字列を 'に再帰的に置き換えるには?

(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'rczshset -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提供します。入力の各文字名を提供します。gauconv -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実装(findGNUシステムのGNUを含む)では終わりますが、残りは現在のロケールの文字でデコードできないファイル名を-name '*.tex'一致させることができない場合があります。たとえば、0xe9バイトだけでは文字としてデコードできないため、文字エンコードとしてUTF-8を使用するロケールから呼び出されたファイルを.texスキップします。$'St\xe9phane'コマンドをプレフィックスとして使用すると、LC_ALL=Cこの問題を解決できます。

おすすめ記事