【发布时间】:2018-05-25 04:01:15
【问题描述】:
我正在使用 sed 替换键的值,但 sed 似乎没有正确匹配正则表达式。我拥有的 JSON 与此类似,
...
"env": {
"emailBxUrl": "placeholder"
},
...
我的 sed 命令就是这个,
sed -i "s/^(\ |\t)+\"emailBxUrl\"\:.*$/test/gm file1.json
运行命令后,文件没有变化。我检查了regexr 的正则表达式,它发现“emailBxUrl ...”行很好,如下所示
那么我缺少什么让 sed 命令无法按预期工作?
【问题讨论】:
-
在线站点不适用于 sed,因为 sed 仅支持 BRE/ERE 风格的正则表达式...请参阅 unix.stackexchange.com/questions/119905/… ...这可能适用于 GNU sed
sed 's/^[ \t]\+"emailBxUrl":.*/test/'但您确实应该避免正则表达式首先用于 json.. 使用 json 解析器,如 jq 或带有 json 模块的 python 等,另见mywiki.wooledge.org/Quotes -
您必须在 sed 命令中添加 -E
-
发布扩展的json内容
-
我同意 Sundeep 的观点,即 JSON 数据需要 JSON 解析器。但是,请尝试这样做以减少您的反斜杠:
sed -ri 's/^[[:blank:]]+"emailBxUrl":.*$/test/gm' file1.json- 您显然已经在使用 GNU sed(由于 s/// 的m修饰符),因此-r选项启用扩展正则表达式。 -
期望一些在某些在线站点中工作的正则表达式在所有命令行工具中工作是没有用的,因为每个命令行工具都支持特定的正则表达式类型(例如 BREs、EREs、PCREs)给定的特定选项和特定的警告(例如 sed 中的分隔符,在 awk 中是否是动态的,等等)。如果您确实打算使用命令行工具,请忘记那些在线正则表达式验证网站。