【问题标题】:Find and replace in JSON files在 JSON 文件中查找和替换
【发布时间】:2018-07-25 01:35:04
【问题描述】:

我是脚本新手。

我有以下三个文件:

Availability.json
Source URLs.txt
Target URLs.txt

我的要求是我需要搜索 Source URLs.txt 中存在的 URL,并将其替换为 Availability.json 文件中的 Target URLs.txt。

我们如何在 shell 脚本中实现这一点?我们有大约 50 个网址。

内容: 可用性.json

"drillDownUrl": "https://appdync-mex-cgn-2u.mex.group.net:8090/controller/#/location=METRIC_BROWSER&timeRange=last_30_minutes.BEFORE_NOW.-1.-1.180&application=1000&metrics=APPLICATION_COMPONENT.647.4743559",

         "label": null,
        "description": null,
        "drillDownUrl": "https://appdync-mex-cpo-7u.mex.group.net:8090/controller/#/location=METRIC_BROWSER&timeRange=last_30_minutes.BEFORE_NOW.-1.-1.180&application=1&metrics=APPLICATION_COMPONENT.647.474",

Source_URLs.txt

 https://appdync-mex-cgn-2u.mex.group.net:8090/controller/#/location=METRIC_BROWSER&timeRange=last_30_minutes.BEFORE_NOW.-1.-1.180&application=1000&metrics=APPLICATION_COMPONENT.647.4743559

https://appdync-mex-cpo-7u.mex.group.net:8090/controller/#/location=METRIC_BROWSER&timeRange=last_30_minutes.BEFORE_NOW.-1.-1.180&application=1&metrics=APPLICATION_COMPONENT.647.474

Target_URLs.txt:

https://www.apdyn.com/Application#=12
https://www.appdyn.com/Application#=123

【问题讨论】:

  • 您需要稍微分解一下问题,并向我们展示其中一些文件中的内容。
  • 在 json 文件中,我们有大约 50 个类似于 appdyn.net/Application=12/components=12345....In Source_URLs.txt 的 URL,我们有 json 中存在的所有 50 个 URL,在 Target_URLs.txt 我们有要替换的 URL...需要替换 Target_URLs 文件 injson 文件中的所有 50 个 URL...希望它有意义...
  • 您需要展示您的 JSON 样本以及源 URL 和目标 URL 的示例。您在此处粘贴的链接无效。
  • 你用的是什么外壳?重击?您是否需要它仅与您的外壳一起使用,或者您的目标是广泛兼容?最好在这里具体一点。
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。

标签: shell scripting


【解决方案1】:

更新版本 - 建议使用 readarray,sed 中的分隔符现在是 |。我用了你的文件名。请删除Source_URLs.txt中的空白行和前导空格

readarray -t SRC < Source_URLs.txt
echo "${SRC[1]}"

readarray -t TRGT < Target_URLs.txt
echo "${TRGT[1]}"

for (( i=0; i<${#SRC[@]}; i++ ));
do
  sed -i "s|${SRC[$i]}|${TRGT[$i]}|g" Availability.json
done

注意:您的 Availability.json 无效 - 最后一个字符是 , 有重复的键并且没有对象 - 在 https://jsonformatter.curiousconcept.com/ 中检查它

【讨论】:

  • 在脚本的开头添加这一行以去掉 Source_URLs.txt: sed -i "/^[[:space:]]*$/d" Source_URLs.txt 中的空白行
【解决方案2】:

将您的网址加载到数组中(检查https://stackoverflow.com/a/11393884/2235381)根据您的操作系统,IFS 可能会有所不同。

IFS=$'\r\n' GLOBIGNORE='*' command eval  'SRC=($(cat src.txt))'
echo "${SRC[0]}"

IFS=$'\r\n' GLOBIGNORE='*' command eval  'TRGT=($(cat trgt.txt))'
echo "${TRGT[0]}"

备份您的 json,然后使用 sed -i 遍历数组,例如:

for (( i=0; i<${#SRC[@]}; i++ ));
do
  sed -i "s/${SRC[$i]}/${TRGT[$i]}/g" your.json
done

我知道这有点蛮力,但 50 行可以。如果有,建议更好的解决方案。

【讨论】:

  • 感谢您的想法...我会试一试
  • 收到以下错误,您能帮忙吗? sed:-e 表达式 #1,字符 11:s' sed: -e expression #1, char 11: unknown option to s' 的未知选项
  • 用文件内容更新了我的问题,请赐教
  • 网址中有/s。当$foo$bar 有斜线时,您不能使用s/$foo/$bar/。 (这对于使用解析为正则表达式的字符的任何 URL 也将出现异常;例如,URL 中的任何 . 都将被视为通配符,匹配任何字符。
  • ...这里的eval 用法是不幸的重大安全错误级别,完全没有必要。 readarray -t src &lt;src.txt 是一种更安全的方法,可以将文件读入数组,每行一个条目。 (有关eval 造成的风险的一些背景信息,请参阅BashFAQ #48)。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2014-08-17
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多