使用sed替换括号内的`,`

橙子

我想用空格替换括号内的逗号(并删除括号)。我曾经使用过sed,但是我能想到的解决方案取决于列表中的元素。

sed 's/\[\(.*\), \(.*\)\]/\1 \2/g'

# [-0.0, 1.23]       => -0.0 1.23   (works)
# [-0.0, 1.23, 4.56] => -0.0, 1.23 4.56 (doesn't work)
# foo=[12.3, 4.5, 3.0, 4.1], bar=123.0, xyz=6.7 => foo=12.3, 4.5, 3.0 4.1, bar=123.0, xyz=6.7` (doesn't work, expected: foo=12.3 4.5 3.0 4.1, bar=123.0, xyz=6.7)

有什么方法sed可以用来做我想要的吗?

约翰1024

考虑以下测试文件:

$ cat file
[-0.0, 1.23]
[-0.0, 1.23, 4.56]
foo=[12.3, 4.5, 3.0, 4.1], bar=123.0, xyz=6.7
[1,2,-3,4]

要删除方括号内的任何逗号以及删除方括号,请执行以下操作:

$ sed -E ':a; s/(\[[^],]*), */\1 /; ta; s/\[([^]]*)\]/\1/g' file
-0.0 1.23
-0.0 1.23 4.56
foo=12.3 4.5 3.0 4.1, bar=123.0, xyz=6.7
1 2 -3 4

这个怎么运作

  • :a

    这定义了一个标签a

  • s/(\[[^],]*), */\1 /

    这将查找方括号内的第一个逗号并将其删除。

    [^],]匹配除]以外的任何字符,因此,(\[[^],]*)匹配[后跟任意数量的字符not],,并将结果存储在组1中。

  • ta

    如果上述替换导致更改,请跳回到标签,a以便我们可以再次尝试替换。

  • s/\[([^]]*)\]/\1/g

    完成删除逗号后,这将删除方括号。

    请注意,[^]]该字符匹配 匹配的任何字符]因此\[([^]]*)\]匹配[后跟一个]后跟以外的任意数量的任何字符]换句话说,它与单个括号表达式匹配,并且表达式的内容(不包括方括号)存储在组1中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章