Замена с помощью Grep

Замена с помощью Grep

У меня есть пример текста, например такой:

\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\setlength{\parindent}{0em}
\setlength{\parskip}{2ex plus1ex minus0.5ex}
\newcommand{\stylea}[1]{\noindent{\textcolor[rgb]{0.9, 0.9, 0.8}{\fcolorbox[rgb]{0, 0, 0}{0.2, 0.2, 0.2}{#1}}}}

\begin{document}
\ttfamily
\setlength{\fboxrule}{0pt}
\setlength{\fboxsep}{0pt}
1 \stylea{\# Author{\hspace*{1em}}: Bhishan Poudel} \\
2 \stylea{\# Date{\hspace*{1em}}{\hspace*{1em}}: May 19, 2016} \\
3 \stylea{} \\
4 \stylea{Line wrapping in geany} \\
5 \stylea{===============================================================================} \\
6 \stylea{edit > preference > editor > features > line wrapping} \\
7 \stylea{then,} \\
8 \stylea{document > line wrapping} \\
\end{document}

Я хочу удалить все слова \stylea{ }, сохранив слова внутри {} нетронутыми.

Я знаю, что могу найти и заменить \stylea{ и заменить на пробел, но мне не нужны пробелы и я хочу одновременно удалить закрывающую скобку }.

Также можем ли мы заменить слова только в выбранном блоке в Geany? Например, если я выберу строки с 1 по 8 и заменю stylea на styleb?

решение1

Замена с помощью Grep

Большую часть этого можно сделать с помощью поиска/замены с использованием регулярных выражений.

Используйте диалоговое окно «Заменить», убедившись, что выбран параметр «Использовать регулярные выражения», а параметр «Использовать многострочное соответствие» — нет.

Искать:

\\stylea{(.*)}

И замените на:

\1

Это регулярное выражение "обратной ссылки" на "захваченный" текст в выражении поиска (часть внутри скобок). Если у вас было несколько захватов, вы могли бы ссылаться на них с помощью \1, \2и т. д.

Однако имейте в виду, что есть ограничение на регулярные выражения, которое, вероятно, вызовет у вас некоторые проблемы. У вас есть несколько строк, где фигурные скобки вложены в текст, например:

\stylea{\# Date{\hspace*{1em}}{\hspace*{1em}}: May 19, 2016}

Регулярные выражения не могут (сами по себе) подсчитывать и сопоставлять вложенные разделители ( {}) таким образом. В вашем случае это может не оказаться практической проблемой, поскольку (.*)захват будет сопоставлять столько символов, сколько сможет до конца строки («жадное сопоставление»), что в вашем тексте-образце оказывается правильным, поскольку каждый \stylea{}тег находится на одной строке. Если у вас есть файлы с \stylea{}тегами, охватывающими несколько строк, этот метод не заменит текст должным образом. Лучшим вариантом может быть сначала найти эти экземпляры и либо изменить их вручную, либо убедиться, что они не охватывают несколько строк.

Это должно работать со многими редакторами, которые предлагают поиск/замену с помощью регулярных выражений, хотя детали параметров диалога, конечно, будут отличаться. Я тестировал это на TextWrangler для Mac OS X.

Замена только в выборе

Выберите 8 пронумерованных строк. Поиск:

\\stylea{

И замените на:

\\styleb{

Затем нажмите кнопку «В выделенном» в диалоговом окне «Заменить».

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