我知道sed
有一种方法可以做到这一点,但我无法让它发挥作用。我有一个 Latex 文件,其中包含用$
.我想将其转换为 MathJax 代码。这仅需要将 a 的奇数实例$
替换为\(
,并将 a 的偶数实例$
替换为\)
。所以
Here is Einstein's equation $E=mc^2$ and here is Newton's law $F=ma$
应该成为
Here is Einstein's equation \(E=mc^2\) and here is Newton's law \(F=ma\)
请注意,连续出现的$
是在同一行,但也可能有多行。我希望替换发生在整个文件中。任何帮助是极大的赞赏。
答案1
使用 GNU sed
:
sed -Ez 's/\$([^$]*)\$/\\(\1\\)/g'
同样没有-E
:
sed -z 's/\$\([^$]*\)\$/\\(\1\\)/g'
这-z
使得 GNUsed
将整个输入当作一行。这是标准功能的扩展sed
。
答案2
$
将紧随其后的单词边界的每个替换为\(
,将$
紧随其后的单词边界的每个替换为\)
:
sed -e 's/\$\</\\(/g' -e 's/\>\$/\\)/g' file
GNUsed
用户可以使用\<
and\>
作为字边界,但也可以使用\b
替代。 BSD 用户可以使用\<
and\>
如图所示,但也可以使用[[:<:]]
and[[:>:]]
,如果他们愿意的话(macOS 用户及其默认 sed
必须使用[[:<:]]
和[[:>:]]
)。