How to batch out lines of code with same code but different variables?
-
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.
-
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
8names :
- Choosing the equal sign as a separator, here is, below, a sample list of
=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 + Dcommand, 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
Replacepanel (Ctrl + H) -
Select the
Regular expressionsearch 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
-
-
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!
-
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
-
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!
-
Hi, @shadowfire-omega and All,
Hope you don’t mind my late reply ! So, given the
8lines"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 Endand 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 group1
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\1is a conditional structure, which means :-
If group
1exists, we replace the string Appraise with the contents of group1 -
If group
1does 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
-
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