{"id":670,"date":"2026-01-21T19:07:34","date_gmt":"2026-01-21T19:07:34","guid":{"rendered":"https:\/\/camilo.matajira.com\/?p=670"},"modified":"2026-01-21T19:07:34","modified_gmt":"2026-01-21T19:07:34","slug":"jed-v0-2","status":"publish","type":"post","link":"https:\/\/camilo.matajira.com\/?p=670","title":{"rendered":"jed v0.2"},"content":{"rendered":"\n<p>This is version v0.2 of jed.<br>Jed is a command-line tool that aims to be the spiritual successor of sed but specialized in JSON data manipulation.<br>I have written about this project before: <a href=\"https:\/\/camilo.matajira.com\/?p=635\" data-type=\"link\" data-id=\"https:\/\/camilo.matajira.com\/?p=635\">https:\/\/camilo.matajira.com\/?p=635<\/a> <a href=\"https:\/\/camilo.matajira.com\/?p=638\" data-type=\"link\" data-id=\"https:\/\/camilo.matajira.com\/?p=638\">https:\/\/camilo.matajira.com\/?p=638<\/a><\/p>\n\n\n\n<p>In this realease I added the following features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Key substitution: You can now substitute keys in JSON objects using regex patterns.<\/li>\n\n\n\n<li>Value substitution: You can now substitute values in JSON objects using regex patterns.<\/li>\n\n\n\n<li>Output with Colors! Using pygments<\/li>\n<\/ul>\n\n\n\n<p>The speed of the tool is remarkable for a tool written in Python. It shows the power of the json and regex modules,<br>both written in C.<\/p>\n\n\n\n<p>Below is the code of the project with the unit test and examples. I still haven&#8217;t upload it to Github, I am waiting for v1.0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Examples<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># With S we apply substitution only to the keys\n\u00bb echo '{\"old_name\":\"value\"}' | .\/jed.py 'S\/old_\/new_\/g'\n{\n    \"new_name\": \"value\"\n}\n\n# With 's' we apply substitution only to the values\n\u00bb echo '{\"old_name\":\"value\"}' | .\/jed.py 's\/value\/new_value\/g'\n{\n    \"old_name\": \"new_value\"\n}\n# Jed supports regular expressions\n\u00bb echo '{\"old_name\":\"value\"}' | .\/jed.py 's\/val.*\/new_value\/g'\n{\n    \"old_name\": \"new_value\"\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6272A4\"># With S we apply substitution only to the keys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u00bb<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">{&quot;old_name&quot;:&quot;value&quot;}<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">.\/jed.py<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">S\/old_\/new_\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">&quot;new_name&quot;<\/span><span style=\"color: #8BE9FD\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">value<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># With &#39;s&#39; we apply substitution only to the values<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u00bb<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">{&quot;old_name&quot;:&quot;value&quot;}<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">.\/jed.py<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">s\/value\/new_value\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">&quot;old_name&quot;<\/span><span style=\"color: #8BE9FD\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">new_value<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># Jed supports regular expressions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u00bb<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">{&quot;old_name&quot;:&quot;value&quot;}<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">.\/jed.py<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">s\/val.*\/new_value\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">&quot;old_name&quot;<\/span><span style=\"color: #8BE9FD\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">new_value<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#!\/usr\/bin\/env -S uv run --script\n#\n# \/\/\/ script\n# requires-python = \">=3.12\"\n# dependencies = &#91;\"lark>=1.3.1\", \"pygments>=2.15.1\"&#93;\n# \/\/\/\n\n\nimport argparse\nimport sys\nimport re\nimport json\nfrom numbers import Number\nfrom lark import Lark, Transformer\nfrom pygments import highlight\nfrom pygments.lexers import JsonLexer\nfrom pygments.formatters import Terminal256Formatter\n\n\ngrammar = r\"\"\"\nstart: command+\n\ncommand: JREGEX* JVALUE? \"s\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_value_regex\n       | JREGEX* JVALUE? \"S\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_key_regex\n\nREGEX: \/[a-zA-Z0-9 \\&#91;\\&#93;+.?*_^-]+\/\nJREGEX: \"\/\"REGEX\"\/\"\".\"?\nJVALUE: \":\/\"REGEX\"\/\"\nNEW_PATTERN: REGEX\nOLD_PATTERN: REGEX\nFLAGS: LETTER+\n\n%import common.LETTER\n%import common.WS\n%ignore WS\n\"\"\"\n\n\nclass SedTransformer(Transformer):\n    def __init__(self, text):\n        super().__init__()\n        self.text = text\n\n    def jed_substitute_value_regex(self, args):\n        regexp, replace, flags = args\n        self.text = value_substitute(self.text, regexp, replace)\n\n    def jed_substitute_key_regex(self, args):\n        regexp, replace, flags = args\n        self.text = key_substitute(self.text, regexp, replace)\n\n\ndef key_substitute(data: dict, old_regex: str, new: str) -> dict:\n    data_copy = data.copy()\n    compiled_regex = re.compile(old_regex)\n    for i in data.keys():\n        if type(data&#91;i&#93;) is dict:\n            data_copy&#91;i&#93; = key_substitute(data&#91;i&#93;, old_regex, new)\n            if compiled_regex.match(i):\n                data_copy&#91;compiled_regex.sub(new, i)&#93; = data_copy&#91;i&#93;\n                del data_copy&#91;i&#93;\n        elif type(data&#91;i&#93;) is list:\n            result = []\n            for j in data&#91;i&#93;:\n                result.append(key_substitute(j, old_regex, new))\n            data_copy&#91;i&#93; = result\n        elif compiled_regex.search(i):\n            data_copy&#91;compiled_regex.sub(new, i)&#93; = data&#91;i&#93;\n            del data_copy&#91;i&#93;\n    return data_copy\n\n\ndef value_substitute(data: dict | list, old_regex: str, new: str) -> dict:\n    compiled_regex = re.compile(old_regex, re.DOTALL)\n    if isinstance(data, list):\n        result = []\n        for j in data:\n            result.append(value_substitute(j, old_regex, new))\n        return result\n    elif isinstance(data, dict):\n        data_copy = data.copy()\n        for i in data.keys():\n            data_copy&#91;i&#93; = value_substitute(data&#91;i&#93;, old_regex, new)\n        return data_copy\n    elif isinstance(data, bool):\n        data_copy = compiled_regex.sub(new, str(data))\n        if re.match(\"^&#91;Tt&#93;rue$\", data_copy):\n            return True\n        if re.match(\"^&#91;Ff&#93;alse$\", data_copy):\n            return False\n        return data_copy\n    elif isinstance(data, Number):\n        data_copy = compiled_regex.sub(new, str(data))\n        try:\n            return float(data_copy) if \".\" in data_copy else int(data_copy)\n        except ValueError:\n            return data_copy\n    elif data is None:\n        data_copy = compiled_regex.sub(new, \"\")\n        if data_copy == \"\":\n            return None\n        return data_copy\n    else:\n        data_copy = compiled_regex.sub(new, data)\n        return data_copy\n\n\ndef pretty_print_dictionary(data: dict):\n    json_data = json.dumps(data, indent=4)\n    print(highlight(json_data, JsonLexer(), Terminal256Formatter(style=\"dracula\")))\n\n\nif __name__ == \"__main__\":\n    argument_parser = argparse.ArgumentParser(\n        prog=\"jed\",\n        description=\"Sed for json!\",\n    )\n    argument_parser.add_argument(\"jed_script\")\n    args = argument_parser.parse_args()\n\n    grammar_parser = Lark(grammar)\n    tree = grammar_parser.parse(args.jed_script)\n    data = json.loads(sys.stdin.read())\n    t = SedTransformer(data)\n    t.transform(tree)\n    pretty_print_dictionary(t.text)\n\n\n# vim: set syntax=python filetype=python:\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6272A4\">#!\/usr\/bin\/env -S uv run --script<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># \/\/\/ script<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># requires-python = &quot;&gt;=3.12&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># dependencies = &#91;&quot;lark&gt;=1.3.1&quot;, &quot;pygments&gt;=2.15.1&quot;&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># \/\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> argparse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> sys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> re<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> numbers <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> Number<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> lark <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> Lark, Transformer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> pygments <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> highlight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> pygments.lexers <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> JsonLexer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> pygments.formatters <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> Terminal256Formatter<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">grammar <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">r<\/span><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">start: command<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">command: JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;s\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">       <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F1FA8C\"> JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;S\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_key_regex<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">REGEX: \/<\/span><span style=\"color: #BD93F9\">[a-zA-Z0-9 <\/span><span style=\"color: #FF79C6\">\\&#91;\\&#93;<\/span><span style=\"color: #BD93F9\">+.?*_^-]<\/span><span style=\"color: #FF79C6\">+<\/span><span style=\"color: #F1FA8C\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JREGEX: &quot;\/&quot;REGEX&quot;\/&quot;&quot;<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JVALUE: &quot;:\/&quot;REGEX&quot;\/&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">NEW_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">OLD_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">FLAGS: LETTER<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">LETTER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%ignore WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">SedTransformer<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">Transformer<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">__init__<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">text<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD; font-style: italic\">super<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #BD93F9\">__init__<\/span><span style=\"color: #F8F8F2\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> text<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">jed_substitute_value_regex<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">args<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        regexp, replace, flags <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> args<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text, regexp, replace)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">jed_substitute_key_regex<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">args<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        regexp, replace, flags <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> args<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text, regexp, replace)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">key_substitute<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FFB86C; font-style: italic\">data<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">old_regex<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">new<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #FF79C6\">-&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> data.copy()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    compiled_regex <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> re.compile(old_regex)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">for<\/span><span style=\"color: #F8F8F2\"> i <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data.keys():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">type<\/span><span style=\"color: #F8F8F2\">(data&#91;i&#93;) <\/span><span style=\"color: #FF79C6\">is<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            data_copy&#91;i&#93; <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(data&#91;i&#93;, old_regex, new)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> compiled_regex.match(i):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                data_copy&#91;compiled_regex.sub(new, i)&#93; <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> data_copy&#91;i&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #FF79C6\">del<\/span><span style=\"color: #F8F8F2\"> data_copy&#91;i&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">type<\/span><span style=\"color: #F8F8F2\">(data&#91;i&#93;) <\/span><span style=\"color: #FF79C6\">is<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">list<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            result <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">for<\/span><span style=\"color: #F8F8F2\"> j <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data&#91;i&#93;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                result.append(key_substitute(j, old_regex, new))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            data_copy&#91;i&#93; <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> compiled_regex.search(i):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            data_copy&#91;compiled_regex.sub(new, i)&#93; <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> data&#91;i&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">del<\/span><span style=\"color: #F8F8F2\"> data_copy&#91;i&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">value_substitute<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FFB86C; font-style: italic\">data<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">list<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">old_regex<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">new<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #FF79C6\">-&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    compiled_regex <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> re.compile(old_regex, re.<\/span><span style=\"color: #BD93F9\">DOTALL<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">isinstance<\/span><span style=\"color: #F8F8F2\">(data, <\/span><span style=\"color: #8BE9FD; font-style: italic\">list<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        result <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">for<\/span><span style=\"color: #F8F8F2\"> j <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            result.append(value_substitute(j, old_regex, new))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">isinstance<\/span><span style=\"color: #F8F8F2\">(data, <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> data.copy()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">for<\/span><span style=\"color: #F8F8F2\"> i <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data.keys():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            data_copy&#91;i&#93; <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data&#91;i&#93;, old_regex, new)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">isinstance<\/span><span style=\"color: #F8F8F2\">(data, <\/span><span style=\"color: #8BE9FD; font-style: italic\">bool<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> compiled_regex.sub(new, <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">(data))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> re.match(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">^&#91;Tt&#93;rue$<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, data_copy):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> re.match(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">^&#91;Ff&#93;alse$<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, data_copy):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">False<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">isinstance<\/span><span style=\"color: #F8F8F2\">(data, Number):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> compiled_regex.sub(new, <\/span><span style=\"color: #8BE9FD; font-style: italic\">str<\/span><span style=\"color: #F8F8F2\">(data))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">try<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">float<\/span><span style=\"color: #F8F8F2\">(data_copy) <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data_copy <\/span><span style=\"color: #FF79C6\">else<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">int<\/span><span style=\"color: #F8F8F2\">(data_copy)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">except<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">ValueError<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">elif<\/span><span style=\"color: #F8F8F2\"> data <\/span><span style=\"color: #FF79C6\">is<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">None<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> compiled_regex.sub(new, <\/span><span style=\"color: #E9F284\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> data_copy <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">else<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data_copy <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> compiled_regex.sub(new, data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> data_copy<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">pretty_print_dictionary<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FFB86C; font-style: italic\">data<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">dict<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    json_data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.dumps(data, <\/span><span style=\"color: #FFB86C; font-style: italic\">indent<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #BD93F9\">4<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(highlight(json_data, JsonLexer(), Terminal256Formatter(<\/span><span style=\"color: #FFB86C; font-style: italic\">style<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">dracula<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">__name__<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">__main__<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    argument_parser <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> argparse.ArgumentParser(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FFB86C; font-style: italic\">prog<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">jed<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FFB86C; font-style: italic\">description<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">Sed for json!<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    argument_parser.add_argument(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">jed_script<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    args <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> argument_parser.parse_args()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    grammar_parser <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> Lark(grammar)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    tree <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> grammar_parser.parse(args.jed_script)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(sys.stdin.read())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    t <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> SedTransformer(data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    t.transform(tree)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    pretty_print_dictionary(t.text)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># vim: set syntax=python filetype=python:<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Unit tests<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import unittest\nimport json\nfrom jed import key_substitute, value_substitute\n\n\nclass TestInitial(unittest.TestCase):\n    def test_key_substitute_1(self):\n        some_json = '{\"sha\": \"0eb3da11ed489189963045a3d4eb21ba343736cb\", \"node_id\": \"C_kwDOAE3WVdoAKDBlYjNkYTExZWQ0ODkxODk5NjMwNDVhM2Q0ZWIyMWJhMzQzNzM2Y2I\"}'\n        data = json.loads(some_json)\n        data = key_substitute(data, \"sha\", \"new_sha\")\n        assert \"new_sha\" in data.keys()\n\n    def test_key_substitute_recursivity(self):\n        some_json = \"\"\"\n{\n  \"commit\": {\n    \"author\": {\n      \"name\": \"bigmoonbit\"\n    }\n}\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = key_substitute(data, \"a\", \"o\")\n        assert data&#91;\"commit\"&#93;&#91;\"outhor\"&#93;&#91;\"nome\"&#93; == \"bigmoonbit\"\n\n    def test_key_substitute_repeated_keys_keeps_last(self):\n        some_json = \"\"\"\n{\n  \"commit\": {\n    \"author\": {\n      \"name\": \"bigmoonbit\",\n      \"nombre\": \"hola\"\n    }\n}\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = key_substitute(data, \"nombre\", \"name\")\n        # Repeated keys will keep the last one\n        assert data&#91;\"commit\"&#93;&#91;\"author\"&#93;&#91;\"name\"&#93; == \"hola\"\n\n    def test_key_substitute_recursivity_inside_lists(self):\n        some_json = \"\"\"\n{\n  \"commit\": &#91;\n    { \"author\": \"camilo\" },\n    { \"author\": \"andres\" }\n    &#93;\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = key_substitute(data, \"author\", \"autor\")\n        # Repeated keys will keep the last one\n        assert data&#91;\"commit\"&#93;&#91;0&#93;&#91;\"autor\"&#93; == \"camilo\"\n        assert data&#91;\"commit\"&#93;&#91;1&#93;&#91;\"autor\"&#93; == \"andres\"\n\n    def test_value_substitute(self):\n        some_json = \"\"\"\n{\n  \"commit\": {\n    \"author\": {\n      \"name\": \"bigmoonbit\"\n    }\n}\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \"oo\", \"AAA\")\n        assert data&#91;\"commit\"&#93;&#91;\"author\"&#93;&#91;\"name\"&#93; == \"bigmAAAnbit\"\n\n    def test_value_substitute_recursivity_inside_lists(self):\n        some_json = \"\"\"\n{\n  \"commit\": &#91;\n    { \"author\": \"camilo\" },\n    { \"author\": \"andres\" }\n    &#93;\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \"andres\", \"mata\")\n        assert data&#91;\"commit\"&#93;&#91;1&#93;&#91;\"author\"&#93; == \"mata\"\n\n    def test_value_substitute_recursivity_with_list_in_the_root(self):\n        some_json = \"\"\"\n&#91;\n    { \"author\": \"camilo\" },\n    { \"author\": \"andres\" }\n&#93;\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \"andres\", \"mata\")\n        assert data&#91;1&#93;\n        assert data&#91;1&#93;&#91;\"author\"&#93; == \"mata\"\n\n    def test_value_substitute_numbers_can_be_replaced(self):\n        some_json = \"\"\"\n{\n  \"commit\": {\n    \"author\": {\n      \"name\": 5\n    }\n}\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \"5\", \"6\")\n        assert data&#91;\"commit\"&#93;&#91;\"author\"&#93;&#91;\"name\"&#93; == 6\n\n    def test_value_substitute_booleans_can_be_modified(self):\n        some_json = \"\"\"\n{\n  \"commit\": {\n    \"author\": {\n      \"name\": true\n    }\n}\n}\n\"\"\"\n        # TODO\n        # Problem, true is interpreted as True, and I create the text \"True\"\n        # So it's hard for the user to know how to replace booleans\n        data = json.loads(some_json)\n        data = value_substitute(data, \"True\", \"False\")\n        assert data&#91;\"commit\"&#93;&#91;\"author\"&#93;&#91;\"name\"&#93; is False\n\n    def test_value_substitute_random_bug(self):\n        some_json = \"\"\" \n{\n\"sha\": \"03cb1e19da91f0df728914d4c8717f7490df04e4\"\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \".+\", \"hola\")\n        assert data&#91;\"sha\"&#93; == \"hola\"\n\n    def test_value_substitute_numbers_can_be_replaced_2(self):\n        some_json = \"\"\" \n{\n\"sha\": 0\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \".+\", \"hola\")\n        assert data&#91;\"sha\"&#93; == \"hola\"\n\n    def test_value_substitute_nulls_can_be_replaced(self):\n        some_json = \"\"\" \n{\n\"sha\": null\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \".*\", \"hola\")\n        assert data&#91;\"sha\"&#93; == \"hola\"\n\n    def test_value_substitute_new_lines_are_replaced(self):\n        some_json = \"\"\" \n{\n\"sha\": \"a\\\\nb\"\n}\n\"\"\"\n        data = json.loads(some_json)\n        data = value_substitute(data, \".+\", \"hola\")\n        print(data)\n        assert data&#91;\"sha\"&#93; == \"hola\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> unittest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> jed <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> key_substitute, value_substitute<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">TestInitial<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">unittest<\/span><span style=\"color: #F8F8F2\">.<\/span><span style=\"color: #8BE9FD; font-style: italic\">TestCase<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_key_substitute_1<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">{&quot;sha&quot;: &quot;0eb3da11ed489189963045a3d4eb21ba343736cb&quot;, &quot;node_id&quot;: &quot;C_kwDOAE3WVdoAKDBlYjNkYTExZWQ0ODkxODk5NjMwNDVhM2Q0ZWIyMWJhMzQzNzM2Y2I&quot;}<\/span><span style=\"color: #E9F284\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">new_sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">new_sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">in<\/span><span style=\"color: #F8F8F2\"> data.keys()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_key_substitute_recursivity<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &quot;author&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;name&quot;: &quot;bigmoonbit&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">a<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">o<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">outhor<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">nome<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">bigmoonbit<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_key_substitute_repeated_keys_keeps_last<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &quot;author&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;name&quot;: &quot;bigmoonbit&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;nombre&quot;: &quot;hola&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">nombre<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">name<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #6272A4\"># Repeated keys will keep the last one<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">name<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_key_substitute_recursivity_inside_lists<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;camilo&quot; },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;andres&quot; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> key_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">autor<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #6272A4\"># Repeated keys will keep the last one<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #BD93F9\">0<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">autor<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">camilo<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">autor<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">andres<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &quot;author&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;name&quot;: &quot;bigmoonbit&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">oo<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">AAA<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">name<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">bigmAAAnbit<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_recursivity_inside_lists<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;camilo&quot; },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;andres&quot; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">andres<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">mata<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">mata<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_recursivity_with_list_in_the_root<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;camilo&quot; },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    { &quot;author&quot;: &quot;andres&quot; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">andres<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">mata<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">mata<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_numbers_can_be_replaced<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &quot;author&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;name&quot;: 5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">5<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">6<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">name<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">6<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_booleans_can_be_modified<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">  &quot;commit&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    &quot;author&quot;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">      &quot;name&quot;: true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #6272A4\"># <\/span><span style=\"color: #FF79C6\">TODO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #6272A4\"># Problem, true is interpreted as True, and I create the text &quot;True&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #6272A4\"># So it&#39;s hard for the user to know how to replace booleans<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">True<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">False<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">commit<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">author<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93;&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">name<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">is<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_random_bug<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><span style=\"color: #F1FA8C\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&quot;sha&quot;: &quot;03cb1e19da91f0df728914d4c8717f7490df04e4&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.+<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_numbers_can_be_replaced_2<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><span style=\"color: #F1FA8C\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&quot;sha&quot;: 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.+<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_nulls_can_be_replaced<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><span style=\"color: #F1FA8C\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&quot;sha&quot;: null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.*<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">test_value_substitute_new_lines_are_replaced<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        some_json <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><span style=\"color: #F1FA8C\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">&quot;sha&quot;: &quot;a<\/span><span style=\"color: #FF79C6\">\\\\<\/span><span style=\"color: #F1FA8C\">nb&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E9F284\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> json.loads(some_json)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        data <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> value_substitute(data, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.+<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">assert<\/span><span style=\"color: #F8F8F2\"> data&#91;<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">sha<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">&#93; <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">hola<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>This is version v0.2 of jed.Jed is a command-line tool that aims to be the spiritual successor of sed but specialized in JSON data manipulation.I have written about this project before: https:\/\/camilo.matajira.com\/?p=635 https:\/\/camilo.matajira.com\/?p=638 In this realease I added the following features: The speed of the tool is remarkable for a tool written in Python. It&#8230;<\/p>\n","protected":false},"author":1,"featured_media":356,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects"],"_links":{"self":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=670"}],"version-history":[{"count":1,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/670\/revisions"}],"predecessor-version":[{"id":671,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/670\/revisions\/671"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/media\/356"}],"wp:attachment":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}