【问题标题】:Replace matching pairs of characters with parenthesis用括号替换匹配的字符对
【发布时间】:2017-10-11 16:42:56
【问题描述】:

最好用一个例子来描述。我有一个乳胶源文件(这是一个普通的文本文件),其中包含很多字符$ 包含内联方程,如下所示:

bla bla bla $E = mc^2$ bla blah

我想用\( ... \) 替换文件中$ 字符的每个匹配对,如下所示:

bla bla bla \(E = mc^2\) bla blah

有任何想法,尽可能简单吗?我不确定 grep 是否能够处理这个问题。

假设该文件有 偶数 次出现的$。在这种情况下,我们所要做的就是将奇数位置的$ 替换为\(,将偶数位置的$ 替换为\)

【问题讨论】:

    标签: replace parentheses


    【解决方案1】:

    像这样?

    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;嵌套是不可能的。 (另一方面,\$...)
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多