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

abh*_*air 0 sed text-processing

sed反向引用中,我们是否有可能将一个出现或一个模式替换为它被引用的次数相同?

示例:对于给定的输入,

((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 9

如果你只是想更换所有([)],那么就没有必要向引用。一个简单的tr将完成这项工作:

$ tr '()' '[]' <file
[[23 + 5][23 + 5]]
11 x [2+1] = 11 x 3 = 33
3x[5+2]
Run Code Online (Sandbox Code Playgroud)

或者,用sed

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

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

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

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

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

对于输入线

((23 + 5)(23 + 5))
Run Code Online (Sandbox Code Playgroud)

这将导致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
Run Code Online (Sandbox Code Playgroud)