Используйте Perl, чтобы вставить знак доллара - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь написать однострочник Perl в сценарии Bash, чтобы изменить разделители математического режима в файле LaTeX с "\ [" и "\]" на знаки доллара.

То есть я хочу изменить \[a + b = c\] на $a + b = c$.

К сожалению, я не могу понять, как правильно выбрать знак доллара в Perl.

Самое близкое, что я получил, это использовать perl -pi -e 's/\[/\$/gm' file.tex. Тем не менее, это вставляет \$ в файл вместо одного знака доллара.

Ответы [ 2 ]

5 голосов
/ 15 января 2020

Вы не вставляете \$; Вы просто заменяете [, а не \[ знаком доллара. Сравните:

# Wrong
$ perl -p -e 's/\[/\$/gm' tmp.txt
\$a + b = c\]

# Right
$ perl -p -e 's/\\\[/\$/gm' tmp.txt
$a + b = c\]

Чтобы заменить оба,

$ perl -p -e 's/\\\[|\\\]/\$/gm' tmp.txt
$a + b = c$

Для чего это стоит, вы можете сделать это с помощью стандартного редактора ed, а не perl, хотя экранирование становится немного запутанным (даже переключение на более простое регулярное выражение tripleee для сопоставления с любым из разделителей; оно выглядит одинаково, но двойное значение \\ здесь для printf, а не ed, так как я использую | в операторе замещения.):

$ cat tmp.txt
\[a + b = c\]
$ printf 's|\\\[][]|$|g\nwq\n' | ed tmp.txt
14
12
$ cat tmp.txt
$a + b = c$
5 голосов
/ 15 января 2020

Нет, проблема в том, что вы заменяете (backsla sh -escaped) литерал [ на (backsla sh -escaped) буквальный знак доллара, но не совпадаете или не заменяете литерал backsla sh

Попробуйте это.

perl -pi -e 's/\\[][]/\$/g' file.tex

Флаг /m не показался полезным, поэтому я его убрал.

Квадратные скобки - это класс символов [...], содержащий два буквенных символа ] и [. Они должны быть в таком порядке, чтобы выражение было однозначным (хотя это также выглядит забавно). И, конечно же, \\ является (backsla sh -escaped) буквальным backsla sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...