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 1.7k Views
    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
      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
        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
          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
            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
              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
                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
                • First post
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors