我正在尝试在 Bash 脚本中编写一个 Perl 单行程序,以将 LaTeX 文件中的数学模式分隔符从“\[”和“\]”更改为美元符号。
也就是说,我想更改\[a + b = c\]为$a + b = c$.
不幸的是,我无法弄清楚如何正确地转义 Perl 中的美元符号。
我得到的最接近的是使用perl -pi -e 's/\[/\$/gm' file.tex. 但是,这会插入\$文件而不是单个美元符号。
不,问题是您正在替换(反斜杠转义)文字 [转义)文字美元符号替换(反斜杠转义)文字,但根本不匹配或替换文字反斜杠。
尝试这个。
perl -pi -e 's/\\[][]/\$/g' file.tex
Run Code Online (Sandbox Code Playgroud)
该/m标志似乎并不实用,所以我拿出来。
方括号是一个字符类,[...]包含两个文字字符]和[。它们必须按此顺序排列,以保持表达明确(尽管它看起来也很有趣)。当然,\\是(反斜杠转义的)文字反斜杠。
你没有插入\$; 您只是用美元符号替换[, not \[。相比:
# Wrong
$ perl -p -e 's/\[/\$/gm' tmp.txt
\$a + b = c\]
# Right
$ perl -p -e 's/\\\[/\$/gm' tmp.txt
$a + b = c\]
Run Code Online (Sandbox Code Playgroud)
要更换两者,
$ perl -p -e 's/\\\[|\\\]/\$/gm' tmp.txt
$a + b = c$
Run Code Online (Sandbox Code Playgroud)
就其价值而言,您可以使用标准编辑器来执行此操作ed,而不是perl,尽管转义变得有点麻烦(甚至切换到三元组的更简单的正则表达式以匹配任一分隔符;它看起来相同,但双精度值\\是为printf,而不是ed,因为我|在替换运算符中使用。):
$ cat tmp.txt
\[a + b = c\]
$ printf 's|\\\[][]|$|g\nwq\n' | ed tmp.txt
14
12
$ cat tmp.txt
$a + b = c$
Run Code Online (Sandbox Code Playgroud)