【问题标题】:multiple line tag content replacement if content matches如果内容匹配,则替换多行标签内容
【发布时间】:2012-07-03 03:33:31
【问题描述】:

我对 perl、awk 或 sed 不是很精通,并且我一直在网上搜索解决我的问题的方法一段时间,但不是很成功。

我想换

<math> ... </math>

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

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

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

【问题讨论】:

    标签: perl replace tags sed awk


    【解决方案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=""
      } 
    }'
    

    【讨论】:

    • 感谢您的提示,但如果标签之间包含 \\.我没能做到。
    • 哦,我误解了那部分。对于多行,awk 会做得更好。
    • 如果您能举例说明如何实现这一点,我将不胜感激。否则感谢您的提示。
    • 你去。根据需要改变 \\ 的数量。
    • 酷,几乎做到了。如果 \\ 的数量可以是任意的(但至少为 1),我需要如何修改它。再次感谢。
    【解决方案2】:

    尝试下一个perl 命令。这个怎么运作?它以 slurp 模式读取内容文件,并将其保存在 $f 变量中,然后在单一模式下添加正则表达式(将换行符与 . 匹配)\begin{regex}\end{regex} 如果在 math 之间找到 \\ em> 标签。

    perl -e '
        do { 
            $/ = undef; 
            $f = <> 
        }; 
        $f =~ s#(<math>)(.*\\\\.*)(</math>)#$1\\begin{align}$2\\end{align}$3#s; 
        printf qq|%s|, $f
    ' infile
    

    【讨论】:

    • 您好,Birei,感谢您的帮助。您的脚本没有产生预期的结果,所以我坚持使用 lynxlynxlynx awk 脚本。
    【解决方案3】:

    这可能对你有用(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多