在数学表达式中用方括号替换括号,在 sed 中使用反向引用

在数学表达式中用方括号替换括号,在 sed 中使用反向引用

在反向引用中,我们是否可以sed将出现的事件或模式替换为与引用次数相同的次数?

示例:对于给定的输入,

((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)

我需要单独使用反向引用来替换所有出现的(with[)with (已经用and解决了这个问题)。括号的数量也可以变化。]sedtrsed

答案1

如果您只想将所有内容替换([)with ],则无需反向引用。一个简单的tr任务就可以完成:

$ tr '()' '[]' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

或者,与sed,

$ sed 'y/()/[]/' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

反向引用只能用其自身替换输入中存在的内容,因此我假设您正在考虑尝试匹配括号之间的内容,然后将它们替换为方括号中的相同内容。你可以用循环来做到这一点:

$ sed -E -e ':loop' -e 's/\(([^()]+)\)/[\1]/; tloop' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]

在这里,我们首先定义一个标签 ,loop然后进行替换。如果替换起作用了,那么我们就回到标签loop。我们需要这样做,因为 usings/.../.../g不会找到重叠匹配,而只要有嵌套括号就会有重叠匹配。

替换s/\(([^()]+)\)/[\1]/将找到括号内不包含(or 的任何非空字符串),并将其替换为自身,但将周围的括号替换为方括号。

对于输入线

((23 + 5)(23 + 5))

这将导致sed执行替换四次:

  1. ([23 + 5](23 + 5)),第一个内括号被替换。
  2. ([23 + 5][23 + 5]),然后是第二个内部的。
  3. [[23 + 5][23 + 5]],然后是外层。
  4. 最后一次替换不会执行任何操作,循环将退出。

在替换表达式末尾使用g标志将导致上面的前两个步骤在同一个替换中执行,因为它们不重叠。


使用等效的基本正则表达式(为了便于阅读,上面使用了扩展正则表达式):

sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file

相关内容