Sed 将科学符号转换为TeX数学模式格式

Sed 将科学符号转换为TeX数学模式格式,sed,replace,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^y,或z*x^y,其中z、x和y可以是任何整数或有理数(用小数点表示),正数或负数 我希望将这些转换为TeX的数学模式。例如: $5.01 \cdot 10^2$ 在其他人的帮助下,我成功地用sed创建了这个BASH脚本,以解决项目A和B: sed "s/\-\{0,1\}[0-9]\{1,\}^\-

我在一份文件中混合了几个方程式,如下表所示:

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的数学模式。例如:

$5.01 \cdot 10^2$
在其他人的帮助下,我成功地用
sed
创建了这个
BASH
脚本,以解决项目A和B:

sed "s/\-\{0,1\}[0-9]\{1,\}^\-\{0,1\}[0-9]\{1,\}/$&$/" input > output
这可以将项目A和B转换为数学模式,但我发现它只转换在一行中找到的第一个匹配项。例如,如果一行显示
5^10大于1^2
,则会将其转换为
$5^10$大于1^2
。第二次使用脚本将导致
$$5^10$$大于1^2

我成功地修改了上面的脚本以处理项目C、D和E,但无法理解如何处理后面的第二部分(我已将其标记为“?”):

这带来了一个问题:

  • 即使上述方法可行,如果我先运行第一个
    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$

根据您需要的输出,以下方法是否适合您

[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

 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.01x10^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

它只需将
^
转换回
^

这可能适用于您:

 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

在5^4%A中,您是否希望在处理后删除%A?对不起,我误解了您的问题。我已经更新了答案。您能试用一下并告诉我它是否适合您吗?@Village元字符
表示可选,即无或1,
+
表示一个或多个,
*
表示无或多个,可能会使你的正则表达式看起来更简单。这可能适用于给定的示例,但我认为通常不会。这不适用于
5^10大于1^2
的情况。
 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