Community
    • Login

    Replace text with incremented counter

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    15 Posts 5 Posters 13.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.
    • EkopalypseE
      Ekopalypse @Rupert Russell
      last edited by

      @Rupert-Russell

      best way, afaik, is to use the Plugins Admin from plugins menu I guess.

      1 Reply Last reply Reply Quote 0
      • Alan KilbornA
        Alan Kilborn @Rupert Russell
        last edited by

        @Rupert-Russell

        BTW, it’s NOT an automatic thing.
        Meaning that if you just install the plugin you’ll be able to do what you want in a nice way.
        Installing the plugin only means that you have scripting functionality (yay!).

        There are some examples of doing it with a script on this forum in previous posts.

        In the coming days I’ll put together a sample that makes it work like Textpad (on a ReplaceAll basis). At this point I’m thinking it won’t have an awesome UI but maybe @Ekopalypse has some techniques that could help out with that.

        EkopalypseE Rupert RussellR Alan KilbornA 3 Replies Last reply Reply Quote 3
        • EkopalypseE
          Ekopalypse @Alan Kilborn
          last edited by Ekopalypse

          There are some examples of doing it with a script on this forum in previous posts.

          Not to forget the help function in the python script console

          >>> help(editor.rereplace)
          Help on method rereplace:
          
          rereplace(...) method of Npp.Editor instance
              rereplace( (Editor)arg1, (object)searchRegex, (object)replace) -> None :
                  Regular expression search and replace. Replaces 'searchRegex' with 'replace'.  ^ and $ by default match the starts and end of the document.  Use additional flags (re.MULTILINE) to treat ^ and $ per line.
                  The 'replace' parameter can be a python function, that recieves an object similar to a re.Match object.
                  So you can have a function like
                     def myIncrement(m):
                         return int(m.group(1)) + 1
                  
                  And call rereplace('([0-9]+)', myIncrement) and it will increment all the integers.
          ...
          
          Rupert RussellR 1 Reply Last reply Reply Quote 4
          • Alan KilbornA
            Alan Kilborn
            last edited by

            There are some examples of doing it with a script on this forum in previous posts.

            Some previous history on this topic on the forums follows.
            I’m sure there are others.
            Likely that some of these contain Pythonscripts:

            • https://community.notepad-plus-plus.org/topic/15318/replace-text-with-incremented-counter
            • https://community.notepad-plus-plus.org/topic/16307/need-regex-for-incremental-by-1
            • https://community.notepad-plus-plus.org/topic/16245/find-and-replace
            • https://community.notepad-plus-plus.org/topic/12967/replace-string-across-multiple-files-and-increment-value
            • https://community.notepad-plus-plus.org/topic/12301/replace-text-with-incremented-counter
            1 Reply Last reply Reply Quote 3
            • Rupert RussellR
              Rupert Russell @Ekopalypse
              last edited by

              @Ekopalypse Thanks for your input. I have limited experience with Python. In my use case, I am appending an incrementing counter at the start of every line that is preceded with a pair of carriage returns.

              This numbers each question in the Aiken file. see: http://rupert.id.au/aiken/

              Kind regards,
              Rupert.

              Terry RT 1 Reply Last reply Reply Quote 1
              • Rupert RussellR
                Rupert Russell @Alan Kilborn
                last edited by

                Hi @Alan-Kilborn thanks that would be useful. I have installed Python script into Notepad ++ and I will a play with

                Something more like this, Thanks for the link.
                https://community.notepad-plus-plus.org/topic/15318/replace-text-with-incremented-counter

                count = -1

                def calculate(m):
                global count
                count += 1
                return ‘<TAG>’ + str(count) + ‘<TAG>’

                editor.rereplace(‘<TAG>([0-9]+)<TAG>’, calculate);

                1 Reply Last reply Reply Quote 1
                • Terry RT
                  Terry R @Rupert Russell
                  last edited by

                  @Rupert-Russell said in Replace text with incremented counter:

                  This numbers each question in the Aiken file. see: http://rupert.id.au/aiken/

                  Hi. As a test I decided to see what’s involved in doing this via a regular expression. As the others stated, it would be better using a scripting/programming language however that then involves additional learning, something that might not produce a result quickly.

                  It is certainly possible (at least in my limited testing). Using the examples I gathered from your link I ran up 10 questions. Essentially the steps would be:

                  1. Have each question and multiple answers appear on 1 line, with the question first.
                    2.Insert an incrementing number at the start of the line and if necessary move it to the correct position.
                  2. Change the lines back to the original format with question first. The next few lines would be the multiple answers, followed by a blank line.

                  Now although I have stated 3 steps, in fact each one has a few steps within, however the option is there should you wish to pursue that idea.

                  Good luck
                  Terry

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

                    Hello @rupert-russell, @alan-kilborn, @terry-r and All,

                    Oh, I first thought, as many others, that this goal, needing calculations, was beyond the scope of regular expressions !

                    But, reading @terry-r’s post, I realized that, indeed, a regex solution is possible, in that specific case ;-)) And I already guessed how @terry-r would achieve it !

                    I, myself found out a solution, which uses, successively, a 1st regex S/R, then the Column Editor feature and, then, a 2nd regex S/R

                    Let’s wait a bit for the OP’s answer. Then, we could compare our solutions, ah ah !

                    Best Regards,

                    guy038

                    1 Reply Last reply Reply Quote 0
                    • Alan KilbornA
                      Alan Kilborn @Alan Kilborn
                      last edited by Alan Kilborn

                      @Alan-Kilborn said in Replace text with incremented counter:

                      In the coming days I’ll put together a sample that makes it work like Textpad (on a ReplaceAll basis). At this point I’m thinking it won’t have an awesome UI but maybe @Ekopalypse has some techniques that could help out with that.

                      I saw some activity in this thread (someone upvoted some of my postings–nice–LOL), so I just thought I’d add a comment saying that I’m still working on the script I mentioned.
                      It has suffered from my usual problem: feature creep :-) :-(
                      Stay tuned…

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

                        Hi, @rupert-russell, @alan-kilborn, @terry-r and All,

                        OK, Alan, So here is my regex solution, ( already written ! )

                        Assuming that :

                        • Each possible answer begins with an uppercase letter, immediately followed by a dot and a space characters

                        • The correct letter is preceded by the string ANSWER, in uppercase, immediately followed by a colon and a space characters

                        Let’s start with this initial text data, below, where I, intentionally, added additional line-breaks, in a random order, and removed some others, in order to simulate a general format :

                        This a first test!
                        
                        A. This is
                        B. a test
                        
                        
                        C. to build
                        D. the regex
                        ANSWER: A
                        
                        This a second test!
                        
                        
                        
                        A. This is
                        
                        B. a test
                        
                        C. to build
                        D. the regex
                        ANSWER: B
                        This a third test!
                        A. This is
                        B. a test
                        
                        C. to build
                        
                        
                        D. the regex
                        
                        ANSWER: C
                        
                        • Run this first regex S/R :

                          • SEARCH (?-i)\R+(?=\u\.\x20|ANSWER:)|(\R)+

                          • REPLACE ?1\1:\x20

                        You should obtain the following text, where all stuff of each test is moved in a single line :

                        This a first test! A. This is B. a test C. to build D. the regex ANSWER: A
                        This a second test! A. This is B. a test C. to build D. the regex ANSWER: B
                        This a third test! A. This is B. a test C. to build D. the regex ANSWER: C
                        

                        Now, let’s suppose that we have a 12-lines list ( instead of 3-lines ) :

                        This a first test! A. This is B. a test C. to build D. the regex ANSWER: A
                        This a second test! A. This is B. a test C. to build D. the regex ANSWER: B
                        This a third test! A. This is B. a test C. to build D. the regex ANSWER: C
                        This a fourth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        This a fifth test! A. This is B. a test C. to build D. the regex ANSWER: A
                        This a sixth test! A. This is B. a test C. to build D. the regex ANSWER: B
                        This a seventh test! A. This is B. a test C. to build D. the regex ANSWER: C
                        This a eighth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        This a ninth test! A. This is B. a test C. to build D. the regex ANSWER: A
                        This a tenth test! A. This is B. a test C. to build D. the regex ANSWER: B
                        This a eleventh test! A. This is B. a test C. to build D. the regex ANSWER: C
                        This a twelfth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        
                        • Move the caret at the very beginning of the first line

                        • Select the option Edit > Column Editor

                          • Choose the Number to Insert main option

                          • Type in the value 1 in each field

                          • Do not tick the Leading zeros box ( IMPORTANT )

                          • Verify that the format is Dec

                          • Click on the OK button

                        You’ll get :

                        1 This a first test! A. This is B. a test C. to build D. the regex ANSWER: A
                        2 This a second test! A. This is B. a test C. to build D. the regex ANSWER: B
                        3 This a third test! A. This is B. a test C. to build D. the regex ANSWER: C
                        4 This a fourth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        5 This a fifth test! A. This is B. a test C. to build D. the regex ANSWER: A
                        6 This a sixth test! A. This is B. a test C. to build D. the regex ANSWER: B
                        7 This a seventh test! A. This is B. a test C. to build D. the regex ANSWER: C
                        8 This a eighth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        9 This a ninth test! A. This is B. a test C. to build D. the regex ANSWER: A
                        10This a tenth test! A. This is B. a test C. to build D. the regex ANSWER: B
                        11This a eleventh test! A. This is B. a test C. to build D. the regex ANSWER: C
                        12This a twelfth test! A. This is B. a test C. to build D. the regex ANSWER: D
                        13
                        
                        • Get rid of the empty line 13, at end of this list, if you wish to

                        • Now, run this second and final regex S/R :

                          • SEARCH ^\d+(\x20)?|\x20(\u\.\x20|ANSWER:)

                          • REPLACE \r\n?2\2:$0?1:\x20

                        Here is your expected numbered list of 12 tests. Voila !

                        1 This a first test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        2 This a second test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        3 This a third test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        4 This a fourth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        5 This a fifth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        6 This a sixth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        7 This a seventh test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        8 This a eighth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        9 This a nineth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        10 This a tenth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        11 This a eleventh test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        
                        12 This a twelfth test
                        A. This is
                        B. a test
                        C. to build
                        D. the regex
                        

                        Best Regards,

                        guy038

                        Alan KilbornA 1 Reply Last reply Reply Quote 1
                        • Alan KilbornA
                          Alan Kilborn @guy038
                          last edited by Alan Kilborn

                          @guy038

                          Hmmm, this may be a case of missing the forest while seeing the trees.

                          The script will be a general-purpose solution which mostly follows the OP’s desire, meaning, at replace-time, a special syntax can be present in the replace string which will allow count-based replacement.

                          Here’s the syntax that I’m thinking:

                          foo \i(103,-4,'03') bar

                          This would cause the first replacement to be foo 103 bar, the second replacement to be foo 099 bar, the third is foo 096 bar, etc.

                          I deviate a bit from what the OP exactly wanted, with an optional argument:

                          Note that my 3rd argument to the \i syntax – which is '03' above, is a format specifier for Python’s string formatting routine. Thus for my specific example, it causes zero-padding to a field-width of three, as one can observe in my 099 and 096 output samples.

                          Another example might be foo \i(103,-4,'#x') bar and here are some successive replacements:

                          foo 0x67 bar
                          foo 0x63 bar
                          foo 0x5f bar
                          foo 0x5b bar
                          

                          …and so on…

                          There doesn’t appear to be a great link to the Python format strings, but here’s one that will sort of lead there: https://docs.python.org/3.4/library/string.html#formatstrings

                          By the way, @guy038, I use this regex in code to parse the \i syntax: \\i(?:\((-?\d+)(?:,(-?\d+))?(?:,'(?-s)(.*?)')?\))?. I thought you might enjoy seeing/knowing that. :-)

                          1 Reply Last reply Reply Quote 2
                          • EkopalypseE
                            Ekopalypse
                            last edited by

                            The python 2.7 version of it is at https://docs.python.org/2.7/library/string.html#format-string-syntax

                            1 Reply Last reply Reply Quote 3
                            • First post
                              Last post
                            The Community of users of the Notepad++ text editor.
                            Powered by NodeBB | Contributors