用模式中的反斜杠替换sed?

时间:2012-02-28 11:44:32

标签: regex sed backslash

通过查看http://rubular.com/r/9zDHFh0gGc给出了最佳问题描述。为什么sed不能那样工作?我认为问题取决于片段中的反斜杠\,例如{1+\cos^2 t + t^2} 确切地说,我想在源中替换

Test Text
= \int_0^{\pi}\vvvec
{1+\cos^2 t + t^2}
{1+ \sin^2 t + t^2}
{1 + 2 t^2}
\cdot \vvvec{-2\cos t \sin t}{2\cos t \sin t}{2t}\ud t =
Ende

通过命令sed -r 's/\\vvvec[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}/\\begin\{pmatrix\}\1\\\\\2\\\\\3\\end\{pmatrix\}/g' source并希望得到结果

Test Text
= \int_0^{\pi}\begin{pmatrix}1+\cos^2 t + t^2\\1+ \sin^2 t + t^2\\1 + 2 t^2\end{pmatrix}
\cdot \begin{pmatrix}-2\cos t \sin t\\2\cos t \sin t\\2t\end{pmatrix}\ud t =
Ende

对不起 - 我看不出,为什么不工作。
字符串似乎没问题,因为echo "\vvvec{1}{2}{3}" | sed -r 's/\\vvvec[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}/\\begin\{pmatrix\}\1\\\\\2\\\\\3\\end\{pmatrix\}/g' \begin{pmatrix}1\\2\\3\end{pmatrix}工作正常。 例如,在一个组件中插入\sin时,它会停止工作。

2 个答案:

答案 0 :(得分:0)

字符类中不需要反斜杠,实际上它会向类添加反斜杠。因此\{([^\}]*)\}{\cos t}不匹配。

所以,这似乎有效:

sed -r 's/\\vvvec[[:space:]]*\{([^}]*)\}[[:space:]]*\{([^}]*)\}[[:space:]]*\{([^}]*)\}/\\begin\{pmatrix\}\1\\\\\2\\\\\3\\end\{pmatrix\}/g'

答案 1 :(得分:0)

要正确处理反斜杠,您可以:

  • \ 翻译为 @

    $ tr '\\' '@' <input.txt
    
  • 运行 sed 命令(也使用 @ 作为 \ )< / p>

    $ sed ... >output.txt
    
  • @ 翻译回 \

    $ tr '\\' '@' <output.txt
    
  • 最后,管道所有这些命令