【问题标题】:sed match all brackets/braces open/close in character classsed 匹配字符类中的所有括号/大括号打开/关闭
【发布时间】:2019-11-09 04:21:43
【问题描述】:

我正在尝试使用 gnu sed 在每个方括号 [/] 或波浪括号 {/} 之后添加一个新行字符,但右括号 ] 会造成麻烦:

$ sed 's,\([\[\]{}]\),\1\n,g' test.json

{ "file1": {hello world}, "file2": [1,2,3,4,] }

不匹配任何字符。如果我省略右大括号,它会匹配所有内容(但右大括号):

$ sed 's/\([\[{}]\)/\1\n/g' test.json
{
 "file1": {
hello world}
, "file2": [
1,2,3,4,] }

我可以做些什么来逃避右大括号以使这个正则表达式匹配?

【问题讨论】:

  • 你的预期输出是什么?
  • 你确定你没有重新发明 JSON 漂亮的打印,比如 jq . <<< '{ "file1": {hello world}, "file2": [1,2,3,4,] }'?旁注:您的 JSON 无效,结尾有逗号。

标签: regex sed


【解决方案1】:

关于括号表达式,standard 说:

( ']' ) 将失去其特殊含义并在括号表达式中表示它自己,如果它出现在列表的第一个位置(在初始 ( '^' ) 之后,如果有的话)。否则,它将终止括号表达式,...

和,

特殊字符'.'、'*'、'['和'\'(分别为、)将失去它们的特殊性括号内的意思。

所以在这种情况下,您不需要转义括号表达式中的任何内容,只需将] 设为其中的第一个即可。例如:

$ sed 's/[][{}]/&\n/g' <<EOF
{ "file1": {hello world}, "file2": [1,2,3,4,] }
EOF

{
 "file1": {
hello world}
, "file2": [
1,2,3,4,]
 }

$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多