如何使用sed替换字符串模式与反斜杠

时间:2013-01-20 15:00:30

标签: linux replace sed backslash

我想替换以下模式(上述规则具有更高的优先级)

\right)   -> remain unchanged
\right )  -> remain unchanged
\right]   -> remain unchanged
\right ]  -> remain unchanged
\right}   -> remain unchanged
\right }  -> remain unchanged
\ri)      -> \right)
\ri       -> \rightarrow
\right    -> \rightarrow

换句话说,如果有括号括号或括号,我想要\ right,如果有的话,它应该被\ rightarrow替换。简而言之,我试图将许多缺乏密码的google doc方程转换为适当的LaTeX格式。我想出的是以下

sed -i 's/\\ri\([^g]\)/\\right\1/g' $tempfile1  #first step substitution
sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' $tempfile1 
sed -i 's/\\right \([^])}>|a]\)/\\rightarrow \1/g' $tempfile1 

它可以正常工作,但它没有像预期的那样将\ right \更改为\ rightarrow \。我的测试输入tempfile1如下

\ri\right\right \right)\right]\right }\right )\ri \right ]\righta \al \\

进入

\rightarrow\right\rightarrow \right)\right]\right }\right )\rightarrow \right ]\rightarrow \alpha \\

注意\ right \ part没有正确完成。然后我添加了以下行,认为它会明确地提取剩下的内容,但是,它没有按预期工作,现在我真的很困惑......

sed -i 's/\\right\\/\\rightarrow\\/g' $tempfile1 #why this does not work

提前多多感谢!

1 个答案:

答案 0 :(得分:3)

表达式出现问题:

sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g'

适用于:

\right\right\

第一个匹配为\right\,并将其替换为\rightarrow\;扫描恢复时会出现问题,它从第二个r的{​​{1}}开始,而不是使用反斜杠(这是上一个匹配的一部分)。

简单的诀窍是重复命令......

right

重新扫描通过再次启动 ab initio 来处理第二个sed -i -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' \ -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 序列。