Поиск шаблона в нескольких файлах и замена подчасти во всех случаях

Поиск шаблона в нескольких файлах и замена подчасти во всех случаях

Я помогаю другу с ее диссертацией, написанной в LaTeX, и мне нужно быстрое решение для "поиска и замены". Используя терминал в Linux, как мне найти следующий шаблон:

\caption{*\cite{*}}

и заменить \citeна\protect\cite

Я использовал Kate. Используя его функцию поиска, я изначально нашел более 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

Подобные выражения возможны в perl, если sed у вас не работает. Другие версии sed должны работать, но могут потребовать другого экранирования специальных символов.

Связанный контент