Community
    • Login

    Inserting 2 lines of text 2 lines prior to a known variable

    Scheduled Pinned Locked Moved General Discussion
    6 Posts 4 Posters 2.1k Views 2 Watching
    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.
    • Daniel JamesD Offline
      Daniel James
      last edited by

      I am working on modifying G-code file and I need to enter 2 lines of code 2 lines before a known value.
      “M96” is the consistent value:
      N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
      N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
      N151 G260
      N152 M96
      4fc4c26e-c698-45fa-ab8e-1103b854ab43-image.png
      I need to insert:
      M107
      FV.E. FEEDRATE[7]
      2 Lines before every instance of “M96”
      N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
      M107
      FV.E.FEEDRATE[7]
      N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
      N151 G260
      N152 M96
      a2571720-a1b6-4bf6-8b95-eea5e1005c1f-image.png

      I am able to add the text right above M96 by using the below, but I am not sure how to enter it 2 lines prior.

      Find What = M96
      Replace With = \n\M107\n\FV.E.FEEDRATE[7]\n\M96
      Search Mode = REGULAR EXPRESSION
      Dot Matches Newline =NOT CHECKED

      PeterJonesP 1 Reply Last reply Reply Quote 0
      • PeterJonesP Offline
        PeterJones @Daniel James
        last edited by PeterJones

        @daniel-james ,

        There are multiple ways of doing it.

        One is to use a “lookahead” that matches two whole lines followed by a line containing M96. Because it’s a lookahead, the “cursor” is still at the beginning of the first of those three lines, so any replacement you do will be before those three lines, so 2 lines before the M96:
        FIND = (?-s)(?=^.*$\R.*$\R.*M96\b)
        REPLACE = M107\nFV.E.FEEDRATE[7]\n
        SEARCH MODE = regular expression
        (the (?-s) will cause the regex to be equivalent to .-matches-newline not checked whether or not it’s checked)
        (Because the cursor was at the start of the line two lines before M96, I put the newlines at the end of each line in the replacement)

        Note that I used the Unix LF \n for the newline in the replacement, which is what you showed (though I was confused by the extra \ between your \n and your M107 in the replacement). If you really have Windows CRLF newlines, use \r\n for each newline in the replacement.

        You could also do a non-lookahead match which stores the previous two lines through the M96 in a capture group, or makes use of the $0 “whole capture” group:
        FIND = (?-s)^.*$\R.*$\R.*M96\b
        REPLACE = M107\nFV.E.FEEDRATE[7]\n$0
        SEARCH MODE = Regular Expression

        -—

        Useful References

        • Please Read Before Posting
        • Template for Search/Replace Questions
        • FAQ: Where to find regular expressions (regex) documentation
        • Notepad++ Online User Manual: Searching/Regex
        Daniel JamesD 1 Reply Last reply Reply Quote 1
        • Daniel JamesD Offline
          Daniel James @PeterJones
          last edited by

          @peterjones Thank you! I appreciate it!

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

            Hello @daniel-James, @peterjones and All,

            The regex S/R, provided by @peterjones, supposes that you click ONCE only on the Replace All button

            Indeed, given this INPUT text :

            N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
            N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
            N151 G260
            N152 M96
            
            N153 G04 X50.0063 Y84.3353 I0.8597 J34.9894
            N154 G05 X50.2137 Y85.8542 I-6.7013 J1.6885
            N155 G870
            N156 M96
            

            Assuming that the Wrap around is ticked

            And the following regex S/R :

            SEARCH (?-si)(?=^.+\R.+\R.+M96\b)

            REPLACE M107\nFV.E. FEEDRATE[7]\n

            If you click, for instance, three times on the Replace All button, you’ll get the following OUTPUT text :

            N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            M107
            FV.E. FEEDRATE[7]
            M107
            FV.E. FEEDRATE[7]
            N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
            N151 G260
            N152 M96
            
            N153 G04 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            M107
            FV.E. FEEDRATE[7]
            M107
            FV.E. FEEDRATE[7]
            N154 G05 X50.2137 Y85.8542 I-6.7013 J1.6885
            N155 G870
            N156 M96
            

            Not exactly what we want, isn’t it ?


            We can solve this problem by using backtracking control verbs. The idea is to use the couple (*SKIP)(*FAIL) or (*SKIP)(*F) with the generic regex :

            What I DON’T want(*SKIP)(*F)|What I DO want

            This leads to the practical regex S/R :

            SEARCH (?-si)^M107\R(?:.+\R){3}.+M96\b(*SKIP)(*F)|(?=^.+\R.+\R.+M96\b)

            REPLACE M107\nFV.E. FEEDRATE[7]\n

            Note that the part to discard, before (*SKIP), is the five complete lines beginning with M107 and ending with M96


            So, given the INPUT text, below, containing two sections where the two lines M107...FV.E... have already being inserted :

            N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
            N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
            N151 G260
            N152 M96
            
            N153 G05 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N154 G06 X50.2137 Y85.8542 I-6.7013 J1.6885
            N155 G500
            N156 M96
            
            N157 G07 X50.0063 Y84.3353 I0.8597 J34.9894
            N158 G08 X50.2137 Y85.8542 I-6.7013 J1.6885
            N159 G100
            N160 M96
            
            N161 G00 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N162 G99 X50.2137 Y85.8542 I-6.7013 J1.6885
            N163 G300
            N164 M96
            
            N165 G10 X50.0063 Y84.3353 I0.8597 J34.9894
            N166 G20 X50.2137 Y85.8542 I-6.7013 J1.6885
            N167 G000
            N168 M96
            

            The new regex S/R would give, after a first click on the Replace All button :

            N149 G02 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N150 G03 X50.2137 Y85.8542 I-6.7013 J1.6885
            N151 G260
            N152 M96
            
            N153 G05 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N154 G06 X50.2137 Y85.8542 I-6.7013 J1.6885
            N155 G500
            N156 M96
            
            N157 G07 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N158 G08 X50.2137 Y85.8542 I-6.7013 J1.6885
            N159 G100
            N160 M96
            
            N161 G00 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N162 G99 X50.2137 Y85.8542 I-6.7013 J1.6885
            N163 G300
            N164 M96
            
            N165 G10 X50.0063 Y84.3353 I0.8597 J34.9894
            M107
            FV.E. FEEDRATE[7]
            N166 G20 X50.2137 Y85.8542 I-6.7013 J1.6885
            N167 G000
            N168 M96
            

            And, as expected, all the subsequent clicks, on the Replace All button, would return the message Replace All: O occurrences were replaced !


            If we do not want to use the uncommon (*...) syntaxes, a solution, with a conditional replacement, could be :

            SEARCH (?-si)(^M107\R(?:.+\R){3}.+M96\b)|(?=^.+\R.+\R.+M96\b)

            REPLACE ?1$0:M107\nFV.E. FEEDRATE[7]\n

            However, with this solution, and assuming our second INPUT text, we get :

            • Five replacements after a first click on the Replace All button ( Two identical replacements and three insertions )

            • Five identical replacements after any subsequent click on the Replace All button

            Best Regards,

            guy038

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

              @guy038 said in Inserting 2 lines of text 2 lines prior to a known variable:

              What I DON’T want(*SKIP)(*F)|What I DO want

              THAT is a nice way to put it. :-)

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

                Hi, @alan-kilborn, and All,

                Actually, I was inspired by this article :

                https://www.rexegg.com/backtracking-control-verbs.html#skipfail

                where it is said :

                In effect, (*SKIP)(*FAIL) says: “Throw away anything you can match to the left of me.”


                Please, visit this excellent regex site :

                https://www.rexegg.com

                BR

                guy038

                1 Reply Last reply Reply Quote 0

                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
                • First post
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors