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)

    • duncesplayed@lemmy.one
      link
      fedilink
      arrow-up
      26
      ·
      1 year ago

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

      find . -type f -iname '*.json' -exec sed -i 's/"verified":"10"/"verified":"11"/' '{}' ';'
      
      • wewbull@feddit.uk
        link
        fedilink
        English
        arrow-up
        8
        ·
        1 year ago

        -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.

      • brain_in_a_jar@kbin.social
        link
        fedilink
        arrow-up
        7
        ·
        1 year ago

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

    • vipaal@aussie.zone
      link
      fedilink
      arrow-up
      8
      ·
      1 year ago

      +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

    • d3Xt3r@lemmy.nzM
      link
      fedilink
      arrow-up
      15
      ·
      1 year ago

      That rhymes!

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

    • MrSnowy
      link
      fedilink
      arrow-up
      6
      arrow-down
      1
      ·
      edit-2
      1 year ago

      Name checks out, this is the way

      Our sedvior!

  • dreugeworst
    link
    fedilink
    arrow-up
    13
    arrow-down
    1
    ·
    edit-2
    1 year ago

    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

  • blashork [she/her]@hexbear.net
    link
    fedilink
    English
    arrow-up
    11
    ·
    1 year ago

    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 [comrade/them]@hexbear.netOP
      link
      fedilink
      English
      arrow-up
      3
      arrow-down
      1
      ·
      edit-2
      1 year ago

      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 [she/her]@hexbear.net
        link
        fedilink
        English
        arrow-up
        5
        ·
        edit-2
        1 year ago

        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

    • DefederateLemmyMl@feddit.nl
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      1 year ago

      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.

  • Thurstylark@lemm.ee
    link
    fedilink
    English
    arrow-up
    8
    ·
    1 year ago

    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.

  • TheDeadCell@lemmy.sdf.org
    link
    fedilink
    arrow-up
    4
    ·
    edit-2
    1 year ago

    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.

    • TheDeadCell@lemmy.sdf.org
      link
      fedilink
      arrow-up
      4
      ·
      edit-2
      1 year ago

      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.

      • TheDeadCell@lemmy.sdf.org
        link
        fedilink
        arrow-up
        1
        ·
        1 year ago

        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.