2012-02-28 129 views
1

最好的问题描述是通过查看http://rubular.com/r/9zDHFh0gGc给出的。 sed为什么不能像那样工作?我认为问题取决于片段中的那些反斜杠\,例如{1+\cos^2 t + t^2}
在精确我想通过命令sed -r 's/\\vvvec[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}[[:space:]]*\{([^\}]*)\}/\\begin\{pmatrix\}\1\\\\\2\\\\\3\\end\{pmatrix\}/g' sourcesed替换模式中的反斜杠?

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 

替代和希望得到的结果

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时,它停止工作。

回答

0

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

所以,这似乎工作:

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

这是一个很好的解释:谢谢。但是现在,只有第二行“源”光圈被转换 - 第一行没有。我认为'[:space:]'包含换行符,不是吗?来自:isspace() 检查空格字符。在“C”和“POSIX”语言环境中,它们是:空格,form-feed('\ f'),换行符('\ n'),回车符('\ r'),水平制表符('\ t' )和垂直标签('\ v')。 – 2012-02-28 12:42:32

+0

它确实但sed默认单独处理每行。但你可以绕过它:http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/ – Joni 2012-02-28 13:54:23

0

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

  • 翻译\@

    $ tr '\\' '@' <input.txt 
    
  • 运行sed命令(也使用@\

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

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