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 regex
Please 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
6
requested).
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
¤123456
at the very end of current file -
SEARCH
(?s)&(.*¤)(\d)(\d+)|¤\d+
-
REPLACE
?1\2\1\3\2
-
Tick the
Wrap around
option -
Select the
Regular expression
seardh mode -
Hit, repeatedly, on
Alt + R
(Replace
button ) OR onAlt + A
(Replace All
button ) 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¤86420
at the very end of the file and just use the regex S/R mentionned above !So, from the INPUT text :
------------&--------------&----&&-----------------&----------------&----- ------------&--------------&----&&-----------------&----------------&----- ------------&--------------&----&&-----------------&----------------&----- ¤86420
After
19
replaceemnts, we would get the OUTPUT text :------------8--------------6----42-----------------0----------------8----- ------------6--------------4----20-----------------8----------------6----- ------------4--------------2----08-----------------6----------------4-----
Best Regards,
guy038
-
-