跨多個文件搜尋模式並替換所有出現的子部分

跨多個文件搜尋模式並替換所有出現的子部分

我正在幫助一位朋友用 LaTeX 寫論文,我需要一個「搜尋和替換」的快速解決方案。在 Linux 中使用終端,如何找到以下模式:

\caption{*\cite{*}}

並替換\cite\protect\cite

我用的是凱特。使用其搜尋功能,我最初發現了超過 2000 個匹配項,透過改進搜索,我將其範圍縮小到大約 300 個匹配項。但是我需要進一步縮小範圍,因為我不想替換所有\cite.我只想替換\cite它發生在\caption{}

答案1

假設標題和引文文字不包含特殊字元(特別是*範例中的第一個不應包含\,第二個*不應包含}),則 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 應該可以工作,但可能需要對特殊字元進行不同的轉義。

相關內容