Please need a multiple renewable change
-
Hello,
I have a text in its content contains a character ‘&’ repeated several times, I want to replace each & that exists in the text by :
In the 1st & replace by 1
In the 2nd & replace with 2
the 3rd & replace with 3
the 4th & replace with 4
the 5th & replace with 5
the 6th & replace with 6
And the rest of ‘&’ that are present in the text:Put in the 7th &, the same replacement that I gave before to the 1st & which is 1, and so on for the other ‘&’:
Put in the 8th &’ : the same replacement I gave to the 2nd ‘&’ which is 2
In the 9th &’ : the replacement of the 3rd ‘&’ which is 3
In the 10th &’ : the replacement of the 4th ‘&’ which is 4
in the 11th &’ : replacement of the 5th ‘&’ which is 5
the 12th &’ : the replacement of the 6th ‘&’ which is 6In the 13th & : the replacement will be 1
the 14th & : the replacement will be 2
the 15th & by : 3
the 16th & by : 4
the 17th & by : 5
the 18th & by : 6And so on; always a renewal of this operation described above for the rest of & that are in the text.
Can someone help me ?
And thank you for your help.
-
Not natively in stock Notepad++.
If you have the PythonScript plugin, or ar willing to install it, it’s easy, using the “add_1” style replacement found in the PythonScript documentation.Here’s one such implementation; the instructions for installing PythonScript, creating the script, and running the script are embedded in the comments of the script.
# encoding=utf-8 """this uses the "add_1" style search and replace in Notepad++ INSTRUCTIONS: 1. Install PythonScript * Plugins > Plugins Admin * Click ☑ PythonScript checkbox until checked * click INSTALL * restart Notepad++ as necessary 2. Create new PythonScript script * Plugins > PythonScript > New Script * Give it a reasonable name, like NReplacements.py * Paste in the code from this black box * Save 3. Switch to the document where you want to search/replace 4. Plugins > PythonScript > Scripts > NReplacements You can change the replacement values, or the number of replacements, then save, and it will still run. I used editor.replace() so that & wouldn't have special meaning. If you need to use a regular expression to match your "to-be-matched" text, use editor.rereplace instead. PythonScript has documentation in it's Context-Sensitive Help """ from Npp import * counter = 0 replacements = ('1','2','3','4','5','6') def add_1(m): global counter repl = replacements[counter] counter = (counter + 1) % len(replacements) return repl editor.replace(r'&', add_1) # use editor.rereplace if the first term needs to be a regexPlease note that
&has special meaning for regexes, so I used the non-regexeditor.replace(); normally, I would just useeditor.rereplace(r'...', add_1)so that when the end user decides they need a more powerful search, all they have to do is change the value, without having to remember to change the replace to rereplace. -
Thank you dear PeterJones for your quick response,
I have installed PythonScript plugin, the script works very well as desired, thank you very much for your support.
-
Although the solution has been found (in PythonScript) it does appear to be possible with regular expression (regex) as well, that is if I read the question correctly.
The regex isn’t too daunting to understand and indeed it shows a reoccurring sequence so could easily be extended to whatever modulo was used (currently the number
6requested).
This is using the Find function with search mode set to “regular expression”.
Find What:(([^&]*)&)?(([^&]*)&)?(([^&]*)&)?(([^&]*)&)?(([^&]*)&)?(([^&]*)&)?
Replace With:(?{1}${2}1)(?{3}${4}2)(?{5}${6}3)(?{7}${8}4)(?{9}${10}5)(?{11}${12}6)With “Wrap around” ticked and the "Replace All button pressed it will commence at the start of the file and find the first group of up to 6
&with (or without) characters around them. It will then replace with the numbers 1 through 6 respectively. It then repeats finding the next sequence of up to 6&and so on.So for a description we have:
(([^&]*)&)?- means look for some non&characters (or not, that’s the*) followed by a&character. The?allows for this capture group to be skipped if it does not find the right characters, this allows for a last sequence of less than 6&to be changed. This is then repeated the number of times required (6 in this case).
(?{1}${2}1)- means if group 1 DID capture some characters then we return them without the&(that’s group 2) and then follow that string with a number, in this case1. By repeating this sequence and incrementing the group numbers and the following number as a replacement we will respectively replace up to 6&with the corresponding new number (1 through 6).Terry
-
Hello, @patrick-rozon , @peterjones , @terry-r and All,
Here is my solution. Not ideal, of course, as it would be suitable for small file size, only, but quite flexible !. It also uses a dummy character, not present in current file. I presonally chose the
¤char of my French keyboard but, of course, any other char may be used-
Add a line
¤123456at the very end of current file -
SEARCH
(?s)&(.*¤)(\d)(\d+)|¤\d+ -
REPLACE
?1\2\1\3\2 -
Tick the
Wrap aroundoption -
Select the
Regular expressionseardh mode -
Hit, repeatedly, on
Alt + R(Replacebutton ) OR onAlt + A(Replace Allbutton ) till one of the follwing messages occurs :-
Replace: one occurrence was replaced. No more occurrences were found. -
Replae All: 0 occurrences were replaced in entire file
-
One advantage of this method is that you may change, either, the modudlo and the values, without changing the regex S/R ! For instance, let’s suppose you want to replace any
&char, by any even number ( so, modulo5), in decreasing order, Then, simply add the line¤86420at the very end of the file and just use the regex S/R mentionned above !So, from the INPUT text :
------------&--------------&----&&-----------------&----------------&----- ------------&--------------&----&&-----------------&----------------&----- ------------&--------------&----&&-----------------&----------------&----- ¤86420After
19replaceemnts, we would get the OUTPUT text :------------8--------------6----42-----------------0----------------8----- ------------6--------------4----20-----------------8----------------6----- ------------4--------------2----08-----------------6----------------4-----Best Regards,
guy038
-
-
T Terry R referenced this topic on