如何使用 sed 删除括号而不是全部

How to use sed to remove parenthesis but not all of them

我有一个包含如下行的文件:

("012345", "File City (Spur)  NE", "10.10.10.00", "b.file.file.cluster1")

我想删除 Spur 周围的括号,但不删除开头和结尾 ()。我可以做到这一点并且它有效但正在寻找一个简单的 sed 命令。

 sed -i 's/) //g' myfile.txt
 sed -i 's/ (//g' myfile.txt

不确定是否可行,但希望得到任何帮助。

如果要删除 space 之后的所有 ( 和 space 之前的所有 ),可以使用

sed -i 's/) / /g;s/ (/ /g' myfile.txt

参见 online demo:

s='("012345", "File City (Spur)  NE", "10.10.10.00", "b.file.file.cluster1")'
sed 's/) / /g;s/ (/ /g' <<< "$s"
# => ("012345", "File City Spur  NE", "10.10.10.00", "b.file.file.cluster1")

请注意,在 POSIX BRE 中,正则表达式模式中未转义的 () 字符与文字括号相匹配。

可以用 Perl 编写更精确的解决方案:

perl -i -pe 's/(^\(|\)$)|[()]//g' myfile.txt

看到 online demo。在这里,开头的 ( 和结尾的 ) 被捕获到第 1 组(参见 (^\(|\)$)),然后 [()] 匹配任何 () 在其他上下文中,将匹配项替换为对第 1 组值的反向引用仅恢复开始和结束处的括号。

使用sed分组和反向引用

sed -Ei 's/(\([^(]*).([^\)]*).(.*)//' input_file`
("012345", "File City Spur  NE", "10.10.10.00", "b.file.file.cluster1")

这将匹配整行,不包括表示为 . 不在分组括号内的内括号