我对 perl、awk 或 sed 不是很精通,而且我已经在网上搜索了一段时间来解决我的问题,但不是很成功。
我想更换
<math> ... </math>
和
<math>\begin{align} ... \end{align}</math>
如果 ...
包含\\
. 我的问题是标签之间的字符串<math>
可以跨越多行。我设法用 sed 替换了一行中的标签,但无法让它运行多行。
任何使用 perl、awk 或 sed 的简单解决方案都非常受欢迎。非常感谢。
为每个标签使用单独的表达式,脚本将不受多行的影响:
sed -e 's,<math>,&\\begin{align},g' -e 's,</math>,&\\end{align},g'
编辑:多行 awk 版本:
awk '/<math>/,/<\/math>/ {
if (index($0, "<math>")) {
a=$0
} else {
b = b $0
}
if (index($0, "</math>")) {
if (index(b,"\\\\")) {
sub("<math>","&\\begin{align}", a)
sub("</math>","\\end{align}&", b)
};
print a,b
a=""
b=""
}
}'
这可能对您有用(GNU sed):
sed ':a;$!{N;ba}
/[\x00\x01\x02]/q1
s/<math>/\x00/g
s/<\/math>/\x01/g
s/\\\\/\x02/g
s/\x00\([^\x01\x02]*\)\x01/<math>\1<\/math>/g
s/\x00/<math>\\begin{align}/g
s/\x01/\\end{align}<\/math>/g
s/\x02/\\\\/g' file
尝试下一个perl
命令。这个怎么运作?它以 slurp 模式读取内容文件,将其保存在$f
变量中,然后在单一模式下添加正则表达式(将换行符与 匹配.
)\begin{regex}
,\end{regex}
如果在数学标签\\
之间找到。
perl -e '
do {
$/ = undef;
$f = <>
};
$f =~ s#(<math>)(.*\\\\.*)(</math>)#$1\\begin{align}$2\\end{align}$3#s;
printf qq|%s|, $f
' infile