Community
    • Login

    How to batch out lines of code with same code but different variables?

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    6 Posts 2 Posters 2.1k Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Shadowfire OmegaS Offline
      Shadowfire Omega
      last edited by

      I’m working on macros for a maptool campaign and one thing that keeps getting me is that I have to make multiple(40+) lines of the same code with only minor changes in the variables, while the rest of the code stays the same. Is there a way to insert a list of variables and have notepad++ substitute the second variable for all of the occurrences of the first variable in the second line, then the third for the third line etc…
      Example:
      Line 1:"aAppraise|0|Appraise “+Appraise+”/“eval(+mAppraise+)” “+cAppraise+”,
      Line 2:"aBluff|0|Bluff “+Bluff+”/“eval(+mBluff+)” “+cBluff+”,
      Line 3: (replace all instances of Bluff with Concentration)

      I know I can go line by line with find and replace, but this is pretty tedious as well.

      1 Reply Last reply Reply Quote 0
      • guy038G Offline
        guy038
        last edited by guy038

        Hello, @shadowfire-omega and All,

        Again, with a S/R using regular expressions, there’s a solution ;-))

        • Organize all the names of the variables as a list, one per line, beginning with a separator character, not already used in your text ( For instance, the #, the = or the @ symbol )

          • Choosing the equal sign as a separator, here is, below, a sample list of 8 names :
        =Appraise
        =Bluff
        =Concentration
        =Test
        =Shadowfire
        =Omega
        =OK
        =The End
        
        • Then, using the column mode ( or rectangular selection ), copy the selection of names in the clipboard

        • Now, recopy, with the Ctrl + D command, the first line which is to be changed, as many times, than the number of lines of the previous list ( 8 ), as a template, giving :

        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        
        • Then, placing the cursor at the end of the first line, simply, paste the rectangular selection. You should obtain the following list :
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Appraise
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Bluff
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Concentration
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Test
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Shadowfire
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Omega
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=OK
        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=The End
        
        • Finally, open the Replace panel ( Ctrl + H )

        • Select the Regular expression search mode

        • In the Find what: and Replace with: zones, type the regexes below :

        SEARCH (?-is)Appraise(?=.+=(.+))|=.+

        REPLACE ?1\1

        • Click on the Replace button, as many times as necessary

        Et voilà ! You’ll get the expected text, below :

        "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"
        "aBluff|0|Bluff "+Bluff+"/"eval(+mBluff+)" "+cBluff+"
        "aConcentration|0|Concentration "+Concentration+"/"eval(+mConcentration+)" "+cConcentration+"
        "aTest|0|Test "+Test+"/"eval(+mTest+)" "+cTest+"
        "aShadowfire|0|Shadowfire "+Shadowfire+"/"eval(+mShadowfire+)" "+cShadowfire+"
        "aOmega|0|Omega "+Omega+"/"eval(+mOmega+)" "+cOmega+"
        "aOK|0|OK "+OK+"/"eval(+mOK+)" "+cOK+"
        "aThe End|0|The End "+The End+"/"eval(+mThe End+)" "+cThe End+"
        

        By this means, you can customize any number of lines, at once !!


        Of course, if you used, for instance, the @ separator, instead of the = sign, you must modify the regex as below :

        SEARCH (?-is)Appraise(?=.+@(.+))|@.+

        And if you used the # symbol, the search regex is changed into :

        SEARCH (?-is)Appraise(?=.+#(.+))|#.+

        Best Regards,

        guy038

        1 Reply Last reply Reply Quote 2
        • Shadowfire OmegaS Offline
          Shadowfire Omega
          last edited by

          Works like a charm! Already did the long way, but still have at least 10 more operations like this to deal with for this framework, so thank you big time!

          1 Reply Last reply Reply Quote 1
          • guy038G Offline
            guy038
            last edited by

            Hello, @shadowfire-omega,

            Just explain me the various operations that you need to perform, and maybe, some of them could be gathered in a same regex S/R ;-))

            And, of course, I don’t mind explain my previous regex , if you would like to !

            See you later,

            Cheers,

            guy038

            1 Reply Last reply Reply Quote 0
            • Shadowfire OmegaS Offline
              Shadowfire Omega
              last edited by

              Thank you for the offer, but using what you have provided me is all I currently need. But if you can explain how it works it would be appreciated!

              1 Reply Last reply Reply Quote 0
              • guy038G Offline
                guy038
                last edited by

                Hi, @shadowfire-omega and All,

                Hope you don’t mind my late reply ! So, given the 8 lines "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+", which end, each, with a word, after the = separator sign

                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Appraise
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Bluff
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Concentration
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Test
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Shadowfire
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=Omega
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=OK
                "aAppraise|0|Appraise "+Appraise+"/"eval(+mAppraise+)" "+cAppraise+"=The End
                

                and the regex S/R :

                SEARCH (?-is)Appraise(?=.+=(.+))|=.+

                REPLACE ?1\1

                • First, the (?-is) forces the regex search to be sensitive ( non-insensitive !) to the case and the dot . regex character to represents any single standard character and not an End of Line character

                • Then it matches any of the two alternatives, giving priority to the first one

                  • The regex (?-is)Appraise(?=.+=(.+))

                  • The regex =.+

                • If the first alternative is chosen, it, then, matches the Appraise string but only if the look-ahead feature is verified. That is to say if there is, further on, in the same line, a = sign, followed by some standard characters, which ends the current line. As this condition is, by construction, always true, the part after the = sign is, thus, stored as group 1

                As soon as the = location is reached, by the regex engine, no more = sign can be found, afterwards. So, the first alternative cannot be matched, anymore, in current line !

                • But, now, the second alternative =.+ matches all the end of line, beginning with the = sign

                • In replacement, ?1\1 is a conditional structure, which means :

                  • If group 1 exists, we replace the string Appraise with the contents of group 1

                  • If group 1 does not exist, we do not rewrite anything. So, the range of characters beginning with the = sign till the end of current line, is deleted

                Et voilà !

                Cheers

                guy038

                1 Reply Last reply Reply Quote 1

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                • First post
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors