0

我对 perl、awk 或 sed 不是很精通,而且我已经在网上搜索了一段时间来解决我的问题,但不是很成功。

我想更换

<math> ... </math>

<math>\begin{align} ... \end{align}</math>

如果 ...包含\\. 我的问题是标签之间的字符串<math>可以跨越多行。我设法用 sed 替换了一行中的标签,但无法让它运行多行。

任何使用 perl、awk 或 sed 的简单解决方案都非常受欢迎。非常感谢。

4

3 回答 3

1

为每个标签使用单独的表达式,脚本将不受多行的影响:

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=""
  } 
}'
于 2012-07-02T17:37:19.567 回答
0

这可能对您有用(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
于 2012-07-03T12:51:07.587 回答
0

尝试下一个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
于 2012-07-02T18:04:43.700 回答