sed 命令返回有关 Unmatched (

sed command returns error about Unmatched (

提问人:jjk 提问时间:7/5/2023 最后编辑:Cyrusjjk 更新时间:7/5/2023 访问量:65

问:

我需要去掉方括号,我只需要一次。但是,在此命令之后,我收到以下错误:

sed -ri 's/("opening_hours": \[\[)(.*?)(\]\]/"opening_hours": \[\2\]/' ./foo.txt

错误:sed:-e 表达式 #1,字符 60:不匹配( 或 (

输入(foo.txt):

"opening_hours": [["Pendant les expositions : le jeudi de 12h \u00e0 20h et\u00a0du vendredi au dimanche, de 12h \u00e0 18h"]]
"opening_hours": [["\u00d6ffnungszeiten: Fr-Sa, 15-7 Uhr und nach Vereinbarung", "Open hours: Fri-Sat, 3-7pm and by appointment"]]

预期输出:

"opening_hours": ["Pendant les expositions : le jeudi de 12h \u00e0 20h et\u00a0du vendredi au dimanche, de 12h \u00e0 18h"]
"opening_hours": ["\u00d6ffnungszeiten: Fr-Sa, 15-7 Uhr und nach Vereinbarung", "Open hours: Fri-Sat, 3-7pm and by appointment"]
正则表达式 SED 方括号

评论

1赞 glenn jackman 7/5/2023
sed 不适用于 PCRE 非贪婪量词。.*?
2赞 glenn jackman 7/5/2023
这部分缺少右括号:(\]\]
0赞 glenn jackman 7/5/2023
方括号在更换部件中没有特殊之处,不需要转义。

答:

2赞 Cyrus 7/5/2023 #1

为了更清楚起见,我建议使用两个命令:s

sed 's/\[//; s/]//' foo.txt
2赞 RavinderSingh13 7/5/2023 #2

为了将确切的括号与您显示的示例相匹配,我建议使用以下内容。我使用 2 个替换项,但正则表达式是为了匹配更准确的括号。

sed 's/": \[\["/": [":/; s/"\]\]$/"]/'  Input_file
1赞 potong 7/5/2023 #3

这可能对你有用(GNU sed):

sed -E 's/\[([^][]*)\]/\1/' file

匹配 a,后跟 0 或 non,后跟 a,然后用 和 之间的值替换它。[[]][]

注意匹配项不是 a 或 .[^][][]