Community
    • Login

    Find a line and copy the next 10 lines

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    find in filesmultiline
    11 Posts 7 Posters 25.2k 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.
    • Jeff WiezorekJ
      Jeff Wiezorek
      last edited by

      I have a group of files that I need to find a common entry then copy the next 10 lines every time the entry is present. Is there a way to do this with Notepad++ ?

      1 Reply Last reply Reply Quote 0
      • dailD
        dail
        last edited by

        Check out the LineFilter2 plugin (it is available in the Plugin Manager). You can search and copy lines before/after the result.

        1 Reply Last reply Reply Quote 0
        • Jeff WiezorekJ
          Jeff Wiezorek
          last edited by

          Thanks for the reply that works only for the one file that is in focus. I have 30 log files ( or More) that I need find this entry in and the following 10 lines and copy to a log.

          1 Reply Last reply Reply Quote 0
          • Scott SumnerS
            Scott Sumner
            last edited by

            I needed the “lines after a match” capability today and was a bit shocked to find that LineFilter2 did not seem to be working correctly (it created a “New 1” file but it was empty, even for a very simple search).

            I finally narrowed it down to the fact that the file I was searching was in Notepad++'s secondary editing view (it got there by right-clicking the tab for the file and choosing “Move to Other View”. If I moved the file back to the main view, LineFilter2 then processed the file correctly (it found the matches I expected).

            1 Reply Last reply Reply Quote 0
            • Scott SumnerS
              Scott Sumner
              last edited by

              Adding to what I just posted: I noticed the results of a LineFilter2 search initiated with a file in the secondary view sometimes end up in one of the active files in the main view, definitely not desired! I’d be curious to know if any other fans of the LineFilter2 plugin notice the same behavior.

              1 Reply Last reply Reply Quote 0
              • Jim DaileyJ
                Jim Dailey
                last edited by

                @Jeff-Wiezorek I encourage anyone who programs or routinely works with log files and such learn some scripting language like AWK, PERL, Python, etc.

                There will be many, many times in your career when you will be in a position to knock out some task like the one you mentioned above in a couple of minutes with one of these tools. Yes, you will have to invest some time up front to get proficient enough in your chosen language, but in the long run you will be far better off.

                And don’t ignore the regular expression features of your chosen language! They will not only make your scripts more powerful, but the syntax will likely be very close to your editor’s regular expression syntax too, making you more efficient in the editor.

                Jeff WiezorekJ 1 Reply Last reply Reply Quote 1
                • guy038G
                  guy038
                  last edited by guy038

                  Hello Jeff and All,

                  As Jim, said in his post : with a scripting language, no file can resist :-)) However, as usual, the N++ regex engine should be enough, to get what you want :-))

                  A simple example : let’s suppose that you are looking for the litteral string 12345, anywhere, on a line.

                  • First, to match all the contents of that specific line, as well as its End of Line characters, just use the regex :^.*12345.*\R

                  • Secondly, to select :

                    • All the contents of that line and the next 10 lines, use the regex : ^.*12345.*\R(.*\R){10}

                    • All the contents of that line and the previous 10 lines, use the regex : (.*\R){10}^.*12345.*\R

                    • All the contents of that line and the 5 lines, before and after this line, use the regex : (.*\R){5}^.*12345.*\R(.*\R){5}

                  Note : For the third example, an other syntax, that uses a subroutine call, to the group 1, (?1), is possible : (.*\R){5}^.*12345.*\R(?1){5}

                  That’s all !!

                  Best Regards,

                  guy038

                  Ankur SharmaA 1 Reply Last reply Reply Quote 0
                  • Jeff WiezorekJ
                    Jeff Wiezorek @Jim Dailey
                    last edited by

                    Thanks Jim and All I am getting better with regular and extended expressions and they are a huge help. I found help for a UNIX guy and learned a little more as the files were all Gziped tar files and he was able to search them without opening them all and greped the text out that I needed. Keep learning!

                    1 Reply Last reply Reply Quote 0
                    • Ankur SharmaA
                      Ankur Sharma @guy038
                      last edited by

                      @guy038 Hi i have a requirement where i am looking for string starting with

                      insert_job:AB

                      I want to bookmark all multiple occurances. The whole line containing insert_job:AB and 2 lines up and 10 lines down to this line.

                      Then i want to delete the unbookmarked lines and just save the ab previous output.

                      1 Reply Last reply Reply Quote 0
                      • Terry RT
                        Terry R
                        last edited by Terry R

                        First off @Ankur-Sharma I will say that you should have created this as a new thread, not added to a thread started by someone else and which is quite old (essentially answered).

                        Now I will get on with a possible solution. I don’t know if you have tried the bookmark feature, if you did you likely found it would only bookmark 1 line in the group you want.

                        My idea is that you use the Replace function to add something unique to the start of the lines you want. Then you could remove all those lines which do NOT have this unique string at the start. I’ve used "X-X " but you could select something that suits your file (should not be anything that already exists in the file, possibly 2-3 characters long). These are regex and require the “regular expression” search mode selected and the wrap-around ticked.

                        Find what: ^(?-s)(.+\R)(.+\R)(insert_job:AB.*\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)(.+\R)
                        Replace with: X-X $1X-X $2X-X $3X-X $4X-X $5X-X $6X-X $7X-X $8X-X $9X-X $10X-X $11X-X $12X-X $13

                        Once this step is completed you would then run the following regex to remove all unwanted lines.

                        Find what: (?-s)^[^X](?!-X )
                        Replace with: empty field here <— nothing in this field

                        Then you would finally run this regex to remove the characters we added in the first step.

                        Find what: X-X
                        Replace with: empty field here <— nothing in this field

                        I hope this helps. There MUST be at least 10 lines after the last “insert_job:AB” line for the last occurance to match. If only 10 lines, then add an additional carriage return (enter key) to the last line.

                        Terry

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

                          Hello @ankur-sharma, @terry-r and All,

                          I’m thinking about a very easy solution, with a regex S/R, which does… all the job :-))

                          So, let’s imagine the initial text, below :

                          This a
                          
                          some dummy
                          text
                          
                          to fill up
                          the
                          zone
                          
                          line 1
                          line 2
                          insert_job:AB
                          line 1
                          line 2
                          line 3
                          line 4
                          line 5
                          line 6
                          line 7
                          line 8
                          line 9
                          line 10
                          
                          This a
                          some dummy
                          
                          text
                          to fill up
                          
                          the
                          zone
                          line 1
                          line 2
                          insert_job:AB
                          line 1
                          line 2
                          line 3
                          line 4
                          line 5
                          line 6
                          line 7
                          line 8
                          line 9
                          line 10
                          This a
                          some dummy
                          
                          text
                          to fill up
                          
                          the
                          zone
                          

                          Now :

                          • Open the Replace dialog ( Ctrl + H )

                          • Select the Regular expression search mode

                          • Tick the Wrap around option

                          SEARCH (?s).*?(?-s)((?:^.*\R){2}insert_job:AB\R(?:^.*\R){10})|(?s).+

                          REPLACE ?1\1\r\n

                          • Clic on the Replace All button

                          Et voilà !

                          You should get, as below, the two expected areas of text, separated with a line-break ;-))

                          line 1
                          line 2
                          insert_job:AB
                          line 1
                          line 2
                          line 3
                          line 4
                          line 5
                          line 6
                          line 7
                          line 8
                          line 9
                          line 10
                          
                          line 1
                          line 2
                          insert_job:AB
                          line 1
                          line 2
                          line 3
                          line 4
                          line 5
                          line 6
                          line 7
                          line 8
                          line 9
                          line 10
                          

                          Notes :

                          • The main part of this regex is (?:^.*\R){2}insert_job:AB\R(?:^.*\R){10}, which matches :

                            • 2 complete lines with their line-breaks, in a non-capturing group. So, (?:^.*\R){2}

                            • The complete line insert_job:AB, with its like-break. So, insert_job:AB\R

                            • 10 complete lines with their line-breaks, in a non-capturing group. So, (?:^.*\R){10}

                          • As this main part is embedded in parentheses, it’s stored as group1, for further use , in replacement

                          • The part (?s).*?, at beginning, matches all the multi-lines stuff which precedes the main part

                          • When no more main part can be found, the regex engine tries the second regex (?s).+, placed after the alternation symbol ( | )

                          • This second regex matches all the remaining characters, after the last block of lines to keep till the very end of the file

                          Note that, if the string insert_job:AB is part of a line, you must change the part insert_job:AB\R with .*insert_job:AB.*\R


                          Remark : The method consists to use the following generic regex :

                          SEARCH (?s).*?(Your regex to match)|(?s).*

                          Refer to this post, for further explications :

                          https://notepad-plus-plus.org/community/topic/12710/marked-text-manipulation/8

                          Best Regards,

                          guy038

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