如何使用 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")
这将匹配整行,不包括表示为 .
不在分组括号内的内括号
我有一个包含如下行的文件:
("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")
这将匹配整行,不包括表示为 .
不在分组括号内的内括号