使用 Perl 插入美元符号

Gui*_*rza 1 regex bash perl

我正在尝试在 Bash 脚本中编写一个 Perl 单行程序,以将 LaTeX 文件中的数学模式分隔符从“\[”和“\]”更改为美元符号。

也就是说,我想更改\[a + b = c\]$a + b = c$.

不幸的是,我无法弄清楚如何正确地转义 Perl 中的美元符号。

我得到的最接近的是使用perl -pi -e 's/\[/\$/gm' file.tex. 但是,这会插入\$文件而不是单个美元符号。

tri*_*eee 5

不,问题是您正在替换(反斜杠转义)文字 [转义)文字美元符号替换(反斜杠转义)文字,但根本不匹配或替换文字反斜杠。

尝试这个。

perl -pi -e 's/\\[][]/\$/g' file.tex
Run Code Online (Sandbox Code Playgroud)

/m标志似乎并不实用,所以我拿出来。

方括号是一个字符类,[...]包含两个文字字符][。它们必须按此顺序排列,以保持表达明确(尽管它看起来也很有趣)。当然,\\是(反斜杠转义的)文字反斜杠。


che*_*ner 5

你没有插入\$; 您只是用美元符号替换[, 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)