我在整个文档中混合了几个方程式,出现在以下形式中:
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^y
或z * 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$
答案 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