Pesquise padrões em vários arquivos e substitua uma subparte em todas as ocorrências

Pesquise padrões em vários arquivos e substitua uma subparte em todas as ocorrências

Estou ajudando uma amiga com sua tese escrita em LaTeX e preciso de uma solução rápida para "pesquisar e substituir". Usando um terminal no Linux, como posso encontrar o seguinte padrão:

\caption{*\cite{*}}

e substitua \citepor\protect\cite

Eu estava usando Kate. Usando seu recurso de pesquisa, encontrei inicialmente mais de 2.000 resultados e, ao refinar minha pesquisa, reduzi-a para cerca de 300 resultados. No entanto, preciso restringir ainda mais porque não quero substituir todos \cite. Eu só quero substituir \citese isso ocorrer dentro\caption{}

Responder1

Supondo que o texto da legenda e da citação não contenha caracteres especiais (em particular, o primeiro *no seu exemplo não deve conter \e o segundo *não deve conter }), então um GNU sed regex

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

deveria funcionar, eu acho. Se pode havervaziostrings de legenda e/ou citação, você pode querer alterar os +modificadores para *. Você pode testá-lo sem modificar o(s) arquivo(s) usando

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

Se isso parece encontrar e modificar as instâncias corretas, você pode modificar os arquivos no local usando a -iopção - se ainda não estiver trabalhando em cópias separadas, você pode fazer backups automaticamente

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

Expressões semelhantes são possíveis em perl se sed não funcionar para você. Outras versões do sed devem funcionar, mas podem precisar de escape diferente dos caracteres especiais.

informação relacionada