複数のファイルにわたってパターンを検索し、すべての出現箇所のサブパーツを置き換えます。

複数のファイルにわたってパターンを検索し、すべての出現箇所のサブパーツを置き換えます。

私は友人の LaTeX で書かれた論文を手伝っていますが、「検索と置換」の簡単なソリューションが必要です。Linux のターミナルを使用して、次のパターンを見つけるにはどうすればよいですか。

\caption{*\cite{*}}

そして\cite\protect\cite

私はKateを使っていました。検索機能を使って、最初は2000件以上のヒットを見つけましたが、検索を絞り込むことで300件ほどに絞り込みました。しかし、すべてを置き換えたくないので、さらに絞り込む必要があります\cite\cite\caption{}

答え1

キャプションと引用文に特殊文字が含まれていないと仮定すると(特に、*例の最初の文字には が含まれず\、2番目の文字*には が含まれない})、GNU sed正規表現

s:(\\caption\{[^\]+)(\\cite\{[^}]+\}\}):\1\\protect\2:g

うまくいくと思います。空のキャプションや引用文字列を変更する場合は、+修飾子を に変更する必要があります*。ファイルを変更せずにテストするには、

sed -nr 's:(\\caption\{[^\]+)(\\cite\{[^}]+\}\}):\1\\protect\2:gp' files

適切なインスタンスを見つけて変更できるようであれば、オプションを使用してファイルをその場で変更することができます-i。別のコピーで作業していない場合は、自動的にバックアップを作成できます。

sed -i.bak -r 's:(\\caption\{[^\]+)(\\cite\{[^}]+\}\}):\1\\protect\2:g' files

sed が機能しない場合は、perl でも同様の表現が可能です。sed の他のバージョンでも機能するはずですが、特殊文字のエスケープ方法が異なる場合があります。

関連情報