There have been multiple accounts created with the sole purpose of posting advertisement posts or replies containing unsolicited advertising.

Accounts which solely post advertisements, or persistently post them may be terminated.

I need to replace one line in a ton of . json files

I’m updating foundry to a version 11 and it broke an ass ton of my assets cause they’re all “verified version 10”

So all I have to do is change that number, they’re just maps so no need to update anything else, but I have like 400+ files to convert all in individual folders.

Please tell me there’s an easy way to do this. (I’m on Linux obviously)

dreugeworst ,

You could use jq, which will work no matter how the json is formatted.

Without trying it out, something like the following might work:

jq ‘.path.to.key.to.change |= 11’ file.json > file.json.tmp && mv file.json.tmp file.json

Kangie , (edited )

<span style="color:#323232;">for file in $(find . -type f -iname '*.json'); do
</span><span style="color:#323232;">  sed -i 's/"verified":"10"/"verified":"11"/' $file;
</span><span style="color:#323232;">done
</span>
vipaal ,

+1

And

In the off chance the files are not under git or some other VCS, might be a good idea to add the -b option to backup

duncesplayed ,

Find can actually do the sed itself if you don’t want to use a subshell and a shell loop.


<span style="color:#323232;">find . -type f -iname '*.json' -exec sed -i 's/"verified":"10"/"verified":"11"/' '{}' ';'
</span>
brain_in_a_jar ,

Change the ';' to a '+' for even more efficiency (no need to fork+exec a sed process per file, sed can take multiple files)

wewbull ,

-print0 | xargs -0 sed -i to get a single sed process working across multiple files.

Add a -P 8 to xargs to get 8 parallel processes.

csolisr ,

Today I learned that xargs supports parallelization natively! That’s gonna make some of my scripts much simpler

thurstylark ,

sed or awk might get you there, but something like jq which is meant for json might be a bit more ideal depending on your use-case.

Nulubez ,

find /path -name *.json -exec sed -i ‘s/from/to/g’ {} ; -print

falsem ,

This, unless you want to mess with jq

Goun ,

Yeah, jq doesn’t edit files, right? You’d have to have temp files or something? jq is so good handling json, I wish there was a way of using it to edit files.

NegativeLookBehind ,
@NegativeLookBehind@kbin.social avatar

Output redirect back into the file

brain_in_a_jar ,

That'll give you an empty file 🙂

NegativeLookBehind ,
@NegativeLookBehind@kbin.social avatar

Oh yea, you’re right

SpaceCadet ,
@SpaceCadet@feddit.nl avatar

Typical rookie mistake :D

tony ,

You really want to do it that way anyway… process the files to a new set of files. That way when you screw it up going back is just deleting the new files, fixing and rerunning.

TheDeadCell ,
@TheDeadCell@lemmy.sdf.org avatar

Since I don’t know the structure of your files, I can’t help entirely, but I would use find/locate to get a list of file paths, then use a script to take that list and use sed for the replacement, like this:


<span style="color:#323232;">#!/bin/bash
</span><span style="color:#323232;">for i in ListOfFilePaths.txt
</span><span style="color:#323232;">do
</span><span style="color:#323232;">  sed -i "s/oldtext/newtext/g" $i
</span><span style="color:#323232;">done
</span>

Please copy the entire line for oldtext and newtext to avoid accidental replacements.

Also, I am very new to scripting, and this likely has multiple problems with it. I am just throwing out ideas.

TheDeadCell ,
@TheDeadCell@lemmy.sdf.org avatar

Looked at your github. I would do this in a script:


<span style="color:#323232;">#!/bin/bash
</span><span style="color:#323232;">find /base/path/of/files -type f -name "module.json" > ListOfFilePaths.txt
</span><span style="color:#323232;">
</span><span style="color:#323232;">for i in ListOfFilePaths.txt
</span><span style="color:#323232;">do
</span><span style="color:#323232;">  sed -i "s/oldtext/newtext/g" $i
</span><span style="color:#323232;">done
</span>

Once again, probably not the most efficient way to do it, but it might work.

Ithorian OP ,
@Ithorian@hexbear.net avatar

Thanks I’ll give that a try!

blashork ,
@blashork@hexbear.net avatar

I also agree sed and some regex is your best bet

I recommend formatting the regex with regex101.com, I’m down to help you if you post some examples

Additionally there is a cli tool, I think jq or something like that, for processing json on the command line

I have foundry too, let me see if I can find the files that need to be updated

Ithorian OP ,
@Ithorian@hexbear.net avatar

Here’s the GitHub link to one of the batches of files I’m working with.

This line ,,“compatibility”:{“minimum”:“9”,“verified”:“10”}," needs to say" 11" in all the files

blashork , (edited )
@blashork@hexbear.net avatar

I have made a python script and ran it on a clone of your git repo to confirm it works, simply run it at the root directory of wherever the files are, it will walk through and find module.json and do the replace.


<span style="color:#323232;">#!/usr/bin/env python3
</span><span style="color:#323232;">
</span><span style="color:#323232;">import re
</span><span style="color:#323232;">import os
</span><span style="color:#323232;">
</span><span style="color:#323232;">import fileinput
</span><span style="color:#323232;">
</span><span style="color:#323232;">pattern = re.compile(r'(?P.+)"compatibility":{"minimum":"(?P\d+)","verified":"(?P\d+)"},(?P.+)')
</span><span style="color:#323232;">
</span><span style="color:#323232;">def make11(match):
</span><span style="color:#323232;">    if match.groupdict().get('min', None) and match.groupdict().get('ver', None):
</span><span style="color:#323232;">        return f"{match.groupdict()['pre']}"compatibility":{{"minimum":"11","verified":"11"}},{match.groupdict()['post']}"
</span><span style="color:#323232;">
</span><span style="color:#323232;">for root, dirs, files in os.walk("."):
</span><span style="color:#323232;">    for file in files:
</span><span style="color:#323232;">        if file == "module.json":
</span><span style="color:#323232;">            for line in fileinput.input(f"{root}/{file}", inplace=True):
</span><span style="color:#323232;">                print(re.sub(pattern, make11, line))
</span>

edit: lemmy is fucking with the formatting and removing the fucking regex group names, which will bork it. I’ve tried fixing it, dm me if you want me to send a downloadable link to the script

Kangie ,

Neat script; just a touch overkill IMO compared to just using sed and bash!

Changing the minimum may be undesirable - I think it’s only the latter value that needs to go from 10 -> 11.

Ithorian OP ,
@Ithorian@hexbear.net avatar

Holy shit that’s awesome! Thanks

umami_wasbi ,

If using Python, why not just use JSON module? Simpler and easier maintain without all those regex.

Still +1, on sed if one is on Linux.

SpaceCadet ,
@SpaceCadet@feddit.nl avatar

I also agree sed and some regex is your best bet

Nah, regexes are okay if you really have no other choice, but they’re a bit of a hamfisted tool. For a json file, which is a neatly structured format, I would always try to do it with jq first.

American_Jesus ,

With sed or awk, without a sample is hard to give a proper example.


<span style="color:#323232;">sed -i 's/old/new/g' *.json 
</span>
MrSnowy ,

Name checks out, this is the way

Our sedvior!

d3Xt3r ,

That rhymes!

With sed or awk, without a sample
is hard to give, a proper example

secret301 ,

Not sure but you can always ask chatgpt. Probably using something like sed or awk

FigMcLargeHuge ,

I would love to see what it spit out if you feed it exactly what OP asked.

TheDeadCell ,
@TheDeadCell@lemmy.sdf.org avatar

This was the response from chatgpt when I coppied OP’s exact post. It wasn’t too far off:

Yes, there’s a way to automate this process using a script. You can use a combination of the find command and sed to search and replace the version number in all your files. Here’s a sample command you can use:


<span style="color:#323232;">find /path/to/assets -type f -name </span><span style="color:#183691;">"*.asset"</span><span style="color:#323232;"> -exec sed -i </span><span style="color:#183691;">'s/verified version 10/verified version 11/g' </span><span style="color:#323232;">{} +
</span>

Replace /path/to/assets with the actual path to your asset folders. This command will recursively search for .asset files and replace “verified version 10” with “verified version 11”. Make sure to have a backup of your files before running this command, just in case.

Also, consider testing this on a smaller set of files first to ensure it works as expected before applying it to all 400+ files.

FigMcLargeHuge ,

Cool. Thanks for posting that.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • [email protected]
  • random
  • lifeLocal
  • goranko
  • All magazines