在反向引用中,我们是否可以sed
将出现的事件或模式替换为与引用次数相同的次数?
示例:对于给定的输入,
((23 + 5)(23 + 5))
11 x (2+1) = 11 x 3 = 33
3x(5+2)
我需要单独使用反向引用来替换所有出现的(
with[
和)
with (已经用and解决了这个问题)。括号的数量也可以变化。]
sed
tr
sed
答案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
执行替换四次:
([23 + 5](23 + 5))
,第一个内括号被替换。([23 + 5][23 + 5])
,然后是第二个内部的。[[23 + 5][23 + 5]]
,然后是外层。- 最后一次替换不会执行任何操作,循环将退出。
在替换表达式末尾使用g
标志将导致上面的前两个步骤在同一个替换中执行,因为它们不重叠。
使用等效的基本正则表达式(为了便于阅读,上面使用了扩展正则表达式):
sed -e ':loop' -e 's/(\([^()][^()]*\))/[\1]/; tloop' <file