使用sed替换括号内的“,”

使用sed替换括号内的“,”,sed,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=1

我想用空格替换括号内的逗号(同时删除括号)。我使用了
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
执行我想要的操作?

请考虑以下测试文件:

$ 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/

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

    [^],]
    匹配除
    ]
    之外的任何字符。因此,
    (\[^],]*)
    匹配
    [
    后接任何数量的字符,而不是
    ]
    ,并将结果存储在组1中

  • ta

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

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

    删除完逗号后,将删除方括号

    请注意,
    [^]]
    匹配任何不是
    ]
    的字符。因此,
    \[([^]]*)\]
    匹配一个
    [
    后接任何数字的字符,除了
    ]
    后接
    ]
    。换句话说,它匹配一个括号内的表达式,表达式的内容(不包括方括号)存储在组1中


在案例
echo“[1,2,3,4]”中似乎失败了| sed-E:a;s/(\[^],]*),/\1/;助教;s/\[([^]]*)\]/\1/g'
。这将返回
1,2,3,4
(包括逗号)@kvantour,这是真的。OP的所有示例和代码都是逗号空白。所以,这也是我的代码所需要的。当然,您的示例在逗号后没有空格。如果要使空格成为可选的,请使用:
sed-E':a;s/(\[^],]*),*/\1/;助教;s/\[([^]]*)\]/\1/g'
True。。。但在这种格式中,空格可以替换为减号。此空间通常是标志的位置。@kvantour OK。如果你想让空的选项,添加星:<代码> SED-E:A;s/(\[^],]*),*/\1/;助教;s/\[([^]]*)\]/\1/g'我知道,我只是表示这可能是一个小的更正。您甚至可以将其替换为
[-]