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)
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.
#!/usr/bin/env python3
import re
import os
import fileinput
pattern = re.compile(r'(?P\.+)\"compatibility\":{\"minimum\":\"(?P\\d+)\",\"verified\":\"(?P\\d+)\"},(?P\.+)')
def make11(match):
if match.groupdict().get('min', None) and match.groupdict().get('ver', None):
return f"{match.groupdict()['pre']}\"compatibility\":{{\"minimum\":\"11\",\"verified\":\"11\"}},{match.groupdict()['post']}"
for root, dirs, files in os.walk("."):
for file in files:
if file == "module.json":
for line in fileinput.input(f"{root}/{file}", inplace=True):
print(re.sub(pattern, make11, line))
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
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.
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.
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:
#!/bin/bash
for i in ListOfFilePaths.txt
do
sed -i "s/oldtext/newtext/g" $i
done
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.
Looked at your github. I would do this in a script:
#!/bin/bash
find /base/path/of/files -type f -name "module.json" > ListOfFilePaths.txt
for i in ListOfFilePaths.txt
do
sed -i "s/oldtext/newtext/g" $i
done
Once again, probably not the most efficient way to do it, but it might work.
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:
find /path/to/assets -type f -name "*.asset" -exec sed -i 's/verified version 10/verified version 11/g' {} +
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.