Sed 替换文件中的特定字符串,该文件不是搜索模式的一部分,但在后续文件中

Sed 替换文件中的特定字符串,该文件不是搜索模式的一部分,但在后续文件中,sed,grep,sh,Sed,Grep,Sh,我有一个如下示例所示的配置文件 { "view": "pagelogfile", "text": "menu_logFile", "disabled": false, "icon": null, "cls": "treelevel2", "iconCls": null, "users": ["admin", "guest"], "expanded": null, "leaf": true, "data": [] },

我有一个如下示例所示的配置文件

{
    "view": "pagelogfile",
    "text": "menu_logFile",
    "disabled": false,
    "icon": null,
    "cls": "treelevel2",
    "iconCls": null,
    "users": ["admin", "guest"],
    "expanded": null,
    "leaf": true,
    "data": []
},
{
    "view": "pagemyfeature",
    "text": "menu_myFeature",
    "disabled": false,
    "icon": null,
    "cls": "treelevel2",
    "iconCls": null,
    "users": ["admin", "guest"],
    "expanded": null,
    "leaf": true,
    "data": []
}
根据硬件ID,某些配置选项对某些用户不可用。例如,view:pagemyfeature对用户guest不可用。我必须将用户“guest”从“users”数组中删除。由于同一个用户数组在配置文件中多次出现,我只想在一个地方将其更改为
“users”:[“admin”]
,我唯一的搜索模式是menu\u myFeature,它可以进入该菜单的正确配置数组。如何更改该数组的子项行

这就是我想要的样子

{
    "view": "pagelogfile",
    "text": "menu_logFile",
    "disabled": false,
    "icon": null,
    "cls": "treelevel2",
    "iconCls": null,
    "users": ["admin", "guest"],
    "expanded": null,
    "leaf": true,
    "data": []
},
{
    "view": "pagemyfeature",
    "text": "menu_myFeature",
    "disabled": false,
    "icon": null,
    "cls": "treelevel2",
    "iconCls": null,
    "users": ["admin"],
    "expanded": null,
    "leaf": true,
    "data": []
}

使用sed对pagemyfeature和字符串替换进行Grepping不是问题。但是如何确保以后替换字符串6行?

如果您确实想在
sed
中执行此操作,请尝试此操作。有许多工具可用于
json

sed '/{/{:loop; N; /pagemyfeature/{:loop2; N; /users/s/,\? *"guest"//g; b loop2;}; /}/b; b loop;}' yourfile
更具可读性的格式:

/{/{
    :loop; 
    N; 
    /pagemyfeature/{
        :loop2; 
        N; 
        /users/s/,\? *"guest"//g; b loop2;
    };

    /}/b;

    b loop;
}

您是对的,这是一个json。我不固定在sed上。您建议使用什么作为json操纵器?但是,您的命令会导致一个错误,未终止“}”
sed'/{/{:loop;N;/pagemyfeature/{:loop2;N;/users/s/,\?*“guest”//g;b loop2};/}/b;b loop;}“/var/www/Config/menu.json
您可以使用
jq
。它类似于
sed
,但专门为
json
设计。感谢您对jq的提示。这在我的主机上有效,但我需要为我的目标进行交叉编译。因此,我修复了上面脚本中的语法错误(;缺失),完成了这项工作。非常感谢。