用括号替换匹配的字符对
问题描述:
最好描述一个例子。我有一个乳胶源文件(这是一个普通的文本文件),有很多本地字符的$
封闭内嵌式,像这样:用括号替换匹配的字符对
bla bla bla $E = mc^2$ bla blah
我想更换的匹配对的每个ocurrence通过\(... \)
文件中$
字符,像这样:
bla bla bla \(E = mc^2\) bla blah
要做到这一点,尽可能简单,你知道吗?我不确定grep能够处理这个问题。
假设该文件具有,甚至$
的出现次数。在这种情况下,我们所要做的就是用\(
代替奇数位置的$
,用\)
代替$
。
答
是否这样?
spacewrench$ cat foo
bla bla bla $E = mc^2$ bla blah
spacewrench$ sed -e 's/\$\(.*\)\$/\\(\1\\)/g' < foo
bla bla bla \(E = mc^2\) bla blah
sed
可以做到这一点。如果您的表达式覆盖多行,则可能需要使用反斜杠的数量,以及行尾。
的.*
表达式是贪婪的,所以它可能只放一对括号围绕多个$
一行...您可以修复,通过与[^\$]*
更换.*
。
这不会取代_matching_对,因为无法判断是否有给定的'$'应该关闭前一个'$'或打开一个新的(嵌套的)对。例如,考虑'$ a + $ b * c $ $'。那应该是'(a +)b * c()'还是'(a +(b * c))? (是的,我知道一个比另一个更有意义,但是'sed'不是那么聪明。) –
我不认为胶乳也是那么聪明。 '$'是一个切换,afaik;嵌套是不可能的。 ('\ $',另一方面...) – rici