我的文件包含以下格式:
$$
y = x^2
$$
我正在寻找一种方法(特别是使用sed)将它们转换为:
\begin{equation}
y = x^2
\end{equation}
解决方案不应该依赖于等式的形式(也可能跨越多条线),也不应该依赖于开头$$之前或接近$$之后的文本。 谢谢你的帮助。
答案 0 :(得分:1)
sed '
/^\$\$$/ {
x
s/begin/&/
t use_end_tag
s/^.*$/\\begin{equation}/
h
b
: use_end_tag
s/^.*$/\\end{equation}/
h
}
'
说明:
sed
维护两个缓冲区:模式空间(pspace)和保留空间(hspace)。它以循环方式运行,在每个循环中它读取一行并执行该行的脚本。 pspace通常在每个循环结束时自动打印(除非使用-n
选项),然后在下一个循环之前删除。 hspace在循环之间保存其内容。
脚本的想法是,每当看到$$时,首先检查hspace以查看它是否包含单词" begin"。如果是,则替换结束标记;否则替换begin标签。在任何一种情况下,都将替换标签存储在保留空间中,以便下次检查。
sed '
/^\$\$$/ { # if line contains only $$
x # exchange pspace and hspace
s/begin/&/ # see if "begin" was in hspace
t use_end_tag # if it was, goto use_end_tag
s/^.*$/\\begin{equation}/ # replace pspace with \begin{equation}
h # set hspace to contents of pspace
b # start next cycle after auto-printing
: use_end_tag
s/^.*$/\\end{equation}/ # replace pspace with \end{equation}
h # set hspace to contents of pspace
}
'
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed -r '1{x;s/^/\\begin{equation}\n\\end{equation}/;x};/\$\$/{g;P;s/(.*)\n(.*)/\2\n\1/;h;d}' file
使用所需的字符串填充保留空间。在遇到标记时打印第一行,然后交换字符串以预期下一个标记。
答案 2 :(得分:0)
我无法帮助您sed
,但awk
应该这样做:
awk '/\$\$/ && !f {$0="\\begin{equation}";f=1} /\$\$/ && f {$0="\\end{equation}";f=0}1' file
\begin{equation}
y = x^2
\end{equation}
如果不重复,则不需要f=0
。