замену sed с обратной косой чертой в шаблоне? - PullRequest
1 голос
/ 28 февраля 2012

Наилучшее описание проблемы дано при взгляде на 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 голосов
/ 28 февраля 2012

Чтобы правильно обработать обратную косую черту, вы можете:

  • перевод \ на @

    $ tr '\\' '@' <input.txt
    
  • run sed команда (также используйте @ как \)

    $ sed ... >output.txt
    
  • перевод @ обратно на \

    $ tr '\\' '@' <output.txt
    
  • наконец, передайте все эти команды

0 голосов
/ 28 февраля 2012

Обратная косая черта не требуется в классе символов, фактически она добавляет обратную косую черту к классу.Из-за этого \{([^\}]*)\} не будет соответствовать {\cos t}.

Итак, похоже, это работает:

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