将科学记数法转换为TeX数学模式格式

时间:2011-11-27 05:26:04

标签: sed replace

我在整个文档中混合了几个方程式,出现在以下形式中:

5^4 %A
3^-1 %B
5.01 x 10^2.05 %C
5.01 x 10^2 %D
-5 x 10^3 %E

换句话说,它们的格式为x^yz * x^y,其中z,x和y可以是任何整数或有理数(用小数点表示),正数或负

我希望将这些转换为TeX的数学模式。 E.g:

$5.01 \cdot 10^2$

在其他人的帮助下,我设法用BASH创建了这个sed脚本来解决项目A和B:

sed "s/\-\{0,1\}[0-9]\{1,\}^\-\{0,1\}[0-9]\{1,\}/$&$/" input > output

这可以将项目A和B转换为数学模式,但我发现它只转换它在一行中找到的第一个匹配项。例如,如果一行显示5^10 is greater than 1^2,则会将其转换为$5^10$ is greater than 1^2。脚本的第二次传递会产生$$5^10$$ is greater than 1^2

我设法修改上面的脚本来处理项目C,D和E,但是无法弄清楚如何处理后面的第二部分(我用&#34标记了它; ???"):

sed "s/\-\{0,1\}[0-9]\{1,\}\ x\ \-\{0,1\}[0-9]\{1,\}^\-\{0,1\}[0-9]\{1,\}/???/" input > output

这提出了一个问题:

  • 即使上述方法可行,如果我先运行第一个sed脚本,然后运行第二个,第一个会混淆第二个,即我最终会使用5.01 x $10^2.05$。如果我先运行第二个脚本,那么在运行第二个脚本之后我会以$5.01 x $10^2.05$$结束。

简而言之,如何对文档中的所有项目执行此类转换?

5^4 --> $5^4$
3^-1 --> $3^-1$
5.01 x 10^2.05 --> $5.01 \cdot 10^2.05$
5.01 x 10^2 --> $5.01 \cdot 10^2$
-5 x 10^3 --> $-5 \cdot 10^3$

3 个答案:

答案 0 :(得分:0)

根据您需要的输出,以下方法适合您吗?

[jaypal~/Temp]$ cat file0
5^4
3^-1
5.01 x 10^2.05
5.01 x 10^2
-5 x 10^3

[jaypal~/Temp]$ sed -e 's/^/\$/' -e 's/$/\$/' -e 's/x/\\cdot/' file0
$5^4$
$3^-1$
$5.01 \cdot 10^2.05$
$5.01 \cdot 10^2$
$-5 \cdot 10^3$

答案 1 :(得分:0)

  

但我发现它只转换它在一行中找到的第一个匹配项

使用/g全局替换标记。

最好在几次传递中完成转换文本

通过1

 sed 's/\(-\?[0-9].\?[0-9]*\) x \(-\?[0-9]\{1,\}\)^\([0-9]\{1,\}\.\?[0-9]*\)/$\1 cdot \2^^\3$/g' input > tmp

我们在此处所做的是将\(...\) x \(...\) ^ \(...\)捕获到已记住的sed模式中\1 \2\3然后我们用来转换文本。

这会处理您的%C,%D,%E,例如将5.01 x 10^2.05转换为$5.01 cdot 10^^2.05$。请注意,我们已暂时将^的出现次数转换为^^

通过2

sed -i 's/-\?[0-9]\+\^-\?[0-9]\+/$&$/g' tmp

这将处理您的示例%A和%B。正如我们之前已将^中的10^2.05转换为^^一样,第2遍解决了您所注意到的问题。

通过3

sed -i 's/\^^/^/g' tmp

只需将^^转换回^

即可

答案 2 :(得分:0)

这可能对您有用:

 sed -i 's/\(-\?[0-9]\+\(\.[0-9]\+\)\? \)x\( -\?[0-9]\+\^-\?[0-9]\+\(\.[0-9]\+\)\?\)\|\(-\?[0-9]\+\^-\?[0-9]\+\)/$\1\\cdot\3\5$/g;s/\$\\cdot/$/g' file

尽管GNU sed -r开关让它看起来更加简洁:

 sed -ri 's/(-?[0-9]+(\.[0-9]+)? )x( -?[0-9]+\^-?[0-9]+(\.[0-9]+)?)|(-?[0-9]+\^-?[0-9]+)/$\1\\cdot\3\5$/g;s/\$\\cdot/$/g' file