首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed替换具有多次出现的JSON文件的2种模式

sed替换具有多次出现的JSON文件的2种模式
EN

Stack Overflow用户
提问于 2021-06-07 16:19:55
回答 1查看 75关注 0票数 1

我需要替换JSON文件的两个模式之间的任何表达式,这些模式是多点的,我只想根据我的选择替换它们一次(假设在第4次出现在6)。

我已经创建了一个sed表达式,该表达式在文件中只有一个事件时工作,但是当添加多个事件时,由于某种原因,在试图替换第二个事件时,它不起作用。

这是我的sed:

代码语言:javascript
复制
images_one_line=MAMA

sed -i 's/CDATA\[.*\]\]>/CDATA[ '"${images_one_line}"' ]]>/2' response.json

这是response.json文件:

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* {"id":"1929905018","type":"page","status":"current","title":"CODEFRESH-CHANGE-API","version":{"by":{"type":"known","accountId":"6066297300b79f0070e308cb","accountType":"atlassian","email":"shachar.rajuan@veeva.com","publicName":"shachar.rajuan","profilePicture":{"path":"/wiki/aa-avatar/6066297300b79f0070e308cb","width":48,"height":48,"isDefault":false},"displayName":"Shachar Rajuan","isExternalCollaborator":false,"_expandable":{"operations":"","personalSpace":""},"_links":{"self":"https://crossixsolutions.atlassian.net/wiki/rest/api/user?accountId=6066297300b79f0070e308cb"}},"when":"2021-06-07T16:00:41.499Z","friendlyWhen":"less than a minute ago","message":"","number":128,"minorEdit":false,"syncRev":"4.confluence$content$1929905018.362","syncRevSource":"synchrony-ack","confRev":"confluence$content$1929905018.363","contentTypeModified":false,"_expandable":{"collaborators":"","content":"/rest/api/content/1929905018"},"_links":{"self":"https://crossixsolutions.atlassian.net/wiki/rest/api/content/1929905018/version/128"}},"macroRenderedOutput":{},"body":{"storage":{"value":"<p /><table data-layout=\"default\"><colgroup><col style=\"width: 70.0px;\" /><col style=\"width: 65.0px;\" /><col style=\"width: 222.0px;\" /><col style=\"width: 48.0px;\" /><col style=\"width: 70.0px;\" /><col style=\"width: 48.0px;\" /><col style=\"width: 65.0px;\" /><col style=\"width: 76.0px;\" /><col style=\"width: 96.0px;\" /></colgroup><tbody><tr><th><p><strong>Environment</strong></p></th><th><p><strong>Data Loaded</strong></p></th><th><p><strong>version/branch</strong></p></th><th><p><strong>Owner</strong></p></th><th><p><strong>Used for</strong></p></th><th colspan=\"3\"><p style=\"text-align: center;\"><strong>Cluster size</strong></p></th><th><p><strong>env prefix</strong></p></th></tr><tr><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>Size</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>ES - nodes</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>Mongo - Shards</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p /></td></tr><tr><td><p><span style=\"color: rgb(76,154,255);\">cds-dev-1</span></p></td><td><p>10 node, 1 day,  33 files </p></td><td><ac:structured-macro ac:name=\"warning\" ac:schema-version=\"1\" ac:macro-id=\"20ce769a-0655-4cb5-92ae-8238e47d6729\"><ac:rich-text-body><p>This field is being updated automatically using CodeFresh Build.<br />Do not change it manually! </p></ac:rich-text-body></ac:structured-macro><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"c16e8ce6-aad5-4778-a2f4-eaff5bc3a0f5\"><ac:parameter ac:name=\"language\">bash</ac:parameter><ac:plain-text-body><![CDATA[ \ncds-feeder-srv\n  newTag: devleap \ncds-shard-es-srv\n  newTag: master_fuffffffu \ncds-loader-srv\n  newTag: shahar-pip2  ]]></ac:plain-text-body></ac:structured-macro><p /></td><td><p>DEV/Atara</p></td><td><p>functional tests</p></td><td><p>tiny</p></td><td><p>2 nodes</p></td><td><p>3 shards, M40</p></td><td><p /></td></tr><tr><td><p><span style=\"color: rgb(76,154,255);\">cds-dev-2</span></p></td><td><p>1 node</p></td><td><ac:structured-macro ac:name=\"warning\" ac:schema-version=\"1\" ac:macro-id=\"e233aff4-ae50-4c86-a7c2-188d9b2c03e6\"><ac:rich-text-body><p>This field is being updated automatically using CodeFresh Build.<br />Do not change it manually! </p></ac:rich-text-body></ac:structured-macro><p /><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"985a38af-9f30-4329-a763-368a0ebb3984\"><ac:parameter ac:name=\"language\">bash</ac:parameter><ac:plain-text-body><![CDATA[ cds-feeder-srv\n  newTag: testing ]]></ac:plain-text-body></ac:structured-macro></td><td><p>shalom</p></td><td><p>shalom</p></td><td><p>small</p></td><td><p>1 node</p></td><td><p>1 shard</p></td><td><p /></td></tr></tbody></table><p />","representation":"storage","embeddedContent":[],"_expandable":{"content":"/rest/api/content/1929905018"}},"_expandable":{"editor":"","atlas_doc_format":"","view":"","export_view":"","styled_view":"","dynamic":"","editor2":"","anonymous_export_view":""}},"extensions":{"position":363304566},"_expandable":{"childTypes":"","container":"/rest/api/space/SD","metadata":"","operations":"","schedulePublishDate":"","children":"/rest/api/content/1929905018/child","restrictions":"/rest/api/content/1929905018/restriction/byOperation","history":"/rest/api/content/1929905018/history","ancestors":"","descendants":"/rest/api/content/1929905018/descendant","space":"/rest/api/space/SD"},"_links":{"editui":"/pages/resumedraft.action?draftId=1929905018","webui":"/spaces/SD/pages/1929905018/CODEFRESH-CHANGE-API","context":"/wiki","self":"https://crossixsolutions.atlassian.net/wiki/rest/api/content/1929905018","tinyui":"/x/egMIcw","collection":"/rest/api/content","base":"https://crossixsolutions.atlassian.net/wiki"}}
*/

我的sed正在做的是替换CDATA[]]之间的所有东西,当使用全局选项/g时,我得到的是:

代码语言:javascript
复制
{"id":"1929905018","type":"page","status":"current","title":"CODEFRESH-CHANGE-API","version":{"by":{"type":"known","accountId":"6066297300b79f0070e308cb","accountType":"atlassian","email":"shachar.rajuan@veeva.com","publicName":"shachar.rajuan","profilePicture":{"path":"/wiki/aa-avatar/6066297300b79f0070e308cb","width":48,"height":48,"isDefault":false},"displayName":"Shachar Rajuan","isExternalCollaborator":false,"_expandable":{"operations":"","personalSpace":""},"_links":{"self":"https://crossixsolutions.atlassian.net/wiki/rest/api/user?accountId=6066297300b79f0070e308cb"}},"when":"2021-06-07T16:14:01.265Z","friendlyWhen":"less than a minute ago","message":"Reverted from v. 134","number":136,"minorEdit":false,"syncRev":"4.confluence$content$1929905018.377","syncRevSource":"synchrony-ack","confRev":"confluence$content$1929905018.379","contentTypeModified":false,"_expandable":{"collaborators":"","content":"/rest/api/content/1929905018"},"_links":{"self":"https://crossixsolutions.atlassian.net/wiki/rest/api/content/1929905018/version/136"}},"macroRenderedOutput":{},"body":{"storage":{"value":"<p /><table data-layout=\"default\"><colgroup><col style=\"width: 70.0px;\" /><col style=\"width: 65.0px;\" /><col style=\"width: 222.0px;\" /><col style=\"width: 48.0px;\" /><col style=\"width: 70.0px;\" /><col style=\"width: 48.0px;\" /><col style=\"width: 65.0px;\" /><col style=\"width: 76.0px;\" /><col style=\"width: 96.0px;\" /></colgroup><tbody><tr><th><p><strong>Environment</strong></p></th><th><p><strong>Data Loaded</strong></p></th><th><p><strong>version/branch</strong></p></th><th><p><strong>Owner</strong></p></th><th><p><strong>Used for</strong></p></th><th colspan=\"3\"><p style=\"text-align: center;\"><strong>Cluster size</strong></p></th><th><p><strong>env prefix</strong></p></th></tr><tr><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p /></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>Size</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>ES - nodes</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p><strong>Mongo - Shards</strong></p></td><td data-highlight-colour=\"#f4f5f7\"><p /></td></tr><tr><td><p><span style=\"color: rgb(76,154,255);\">cds-dev-1</span></p></td><td><p>10 node, 1 day,  33 files </p></td><td><ac:structured-macro ac:name=\"warning\" ac:schema-version=\"1\" ac:macro-id=\"20ce769a-0655-4cb5-92ae-8238e47d6729\"><ac:rich-text-body><p>This field is being updated automatically using CodeFresh Build.<br />Do not change it manually! </p></ac:rich-text-body></ac:structured-macro><ac:structured-macro ac:name=\"code\" ac:schema-version=\"1\" ac:macro-id=\"c16e8ce6-aad5-4778-a2f4-eaff5bc3a0f5\"><ac:parameter ac:name=\"language\">bash</ac:parameter><ac:plain-text-body><![CDATA[ cds-feeder-srv newTag: buba cds-shard-es-srv newTag: release3 cds-loader-srv newTag: pip6 ]]></ac:plain-text-body></ac:structured-macro></td><td><p>shalom</p></td><td><p>shalom</p></td><td><p>small</p></td><td><p>1 node</p></td><td><p>1 shard</p></td><td><p /></td></tr></tbody></table><p />","representation":"storage","embeddedContent":[],"_expandable":{"content":"/rest/api/content/1929905018"}},"_expandable":{"editor":"","atlas_doc_format":"","view":"","export_view":"","styled_view":"","dynamic":"","editor2":"","anonymous_export_view":""}},"extensions":{"position":363304566},"_expandable":{"childTypes":"","container":"/rest/api/space/SD","metadata":"","operations":"","schedulePublishDate":"","children":"/rest/api/content/1929905018/child","restrictions":"/rest/api/content/1929905018/restriction/byOperation","history":"/rest/api/content/1929905018/history","ancestors":"","descendants":"/rest/api/content/1929905018/descendant","space":"/rest/api/space/SD"},"_links":{"editui":"/pages/resumedraft.action?draftId=1929905018","webui":"/spaces/SD/pages/1929905018/CODEFRESH-CHANGE-API","context":"/wiki","self":"https://crossixsolutions.atlassian.net/wiki/rest/api/content/1929905018","tinyui":"/x/egMIcw","collection":"/rest/api/content","base":"https://crossixsolutions.atlassian.net/wiki"}}

当使用\2 (应该取代s2d事件)时,我没有看到任何变化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-07 16:38:44

这接近于单行JSON的5 KiB --尝试阅读它是很痛苦的。

[CDATA[…]]有两个序列--第一个约140个字符长,第二个约45个字符长。您的主要问题是,您的.*脚本中的sed符号是“贪婪的”;它将在第一个CDATA之后开始匹配,并一直读到第二个CDATA的末尾。您需要限制它,这样它就不会跳过]]结束标记。这可不是小事。适度的近似是:

代码语言:javascript
复制
sed -e 's/CDATA\[[^]]*\]\]>/CDATA[ '"${images_one_line}"' ]]>/' response.json

这不会在![[标记之前捕获CDATA;这大概并不重要。

然后,您可以使用GNU sed扩展来选择要更改的行中出现的CDATA --在s///命令的close /之后添加一个合适的数字。

请注意,如果CDATA中的数据包含任何近方括号,则仍然会遇到麻烦。

这个版本使用sed‘Extended正则表达式’或ERE支持。这通常是由-E启用的,但GNU sed也会识别-r

代码语言:javascript
复制
sed -E -e 's/<!\[CDATA\[([^]]*|\][^]])*\]\]>/<![CDATA[ substituted ]]>/g' response.json

与Perl兼容的regex会更好--但仍然不是那么简单。这个Perl脚本显示了一个工作版本:

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;
use warnings;

while (<>)
{
    s/<!\[CDATA\[(?:[^]]*|\][^]])*\]\]>/<![CDATA[ substituted ]]>/g;
    print;
}

像这样编辑JSON数据是有问题的,正如注释中所指出的那样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67875281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档