• Login
Community
  • Login

How to add a missing line, based on part of the previous line

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
13 Posts 2 Posters 415 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.
  • G
    guy038
    last edited by guy038 Nov 21, 2024, 11:02 AM Nov 21, 2024, 10:39 AM

    Hello, @dr-ramaanand and All,

    @dr-ramaanand, I’ve finally managed to understand what your goal was ! Not so easy !


    You said :

    However, I want to know how to use a $1 after the \r\n instead of typing the whole (missing) string to be added

    Well, no need to build a regex which uses Backtracking Control verbs for this task and, anyway, you’re probably not yet able to master these concepts !

    So, the obvious solution is to use the following regex S/R :

    • SEARCH <footer(.+?class=).+?>

    • REPLACE $0\r\n<div$1"container">

    • Check the Wrap around option

    Thus, from this INPUT text, pasted in a new tab :

    <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
    

    After a click on the Replace All button, you would get the expected OUTPUT text :

    <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
    <div style="width: 100%; height: auto;" class="container">
    

    Now, there’s still a problem with that S/R : if you repeat the Replace All action, you would wrongly get :

    <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
    <div style="width: 100%; height: auto;" class="container">
    <div style="width: 100%; height: auto;" class="container">
    

    On the other hand, you also said :

    I would also love to know how to use a ?! which is a negative look ahead, before the missing string to add it using a $1 in the Replace field

    To prevent this case to occur and, as you suggested, the solution is to verify that the line <div style="width: 100%; height: auto;" class= does not exsist, right after the line <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">

    This leads to the final regex S/R, which uses, as you said, a negative look-ahead, containing a reference to our group 1

    • SEARCH <footer(.+?class=).+?>(?!\R<div\1)

    • REPLACE $0\r\n<div$1"container">

    This time, after a first click on the Replace All button, any subsequent click on this button will display, as 'expected, the message :

    Replace all: 0 occurrence were replaced in entire file

    This ensures that the replacement just occurs once !


    Remark :

    • In the search regex, you may replace the \1 syntax, within the look-ahead structure, by any of the eight following syntaxes :

    \g1 , \g{1} , \g<1> , \g'1' , \k1 , \k{1} , \k<1> or \k'1'

    • Howewer, you CANNOT use the $1 or ${1} syntaxes in the search regex. These two syntaxes and, of course, \1, are the three syntaxes ONLY allowed in the Replace regex !

    To summarize, this regex S/R adds the line <div style="width: 100%; height: auto;" class="container">, whose part space + style="width: 100%; height: auto;" class= is also a part of the previous line !

    Thus, I decided to rename the title of this topic as : How to add a line, based on part of the previous line

    Best Regards,

    guy038

    D 1 Reply Last reply Nov 21, 2024, 10:58 AM Reply Quote 0
    • D
      dr ramaanand @guy038
      last edited by Nov 21, 2024, 10:58 AM

      @guy038 merci beaucoup but, “How to add a line, based on part of the previous line if that line is missing” is a more appropriate title

      D 1 Reply Last reply Nov 21, 2024, 2:42 PM Reply Quote 0
      • D
        dr ramaanand @dr ramaanand
        last edited by dr ramaanand Nov 21, 2024, 3:00 PM Nov 21, 2024, 2:42 PM

        @guy038 One of my files out of several in a folder had this footer: <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top"> and another had <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">, so I tweaked your Regular expression to <footer style=".+?(width: 100%; height: auto;" class=).+?>(?!\R<div\1) in the Find field but then, it does not skip adding the <div style="width: 100%; height: auto;" class="container"> if it is already added in those two files. I also observe that <footer style="width: 100%; height: auto;" class="panel-footer footer add-top"> cannot be found even if there is no <div..............> on the immediate next line. Does your Regular expression need more tweaking? <footer style=".+?(width: 100%; height: auto;" class=)+?>(?!\R<div style="\1) does not find/match anything

        D 1 Reply Last reply Nov 21, 2024, 4:06 PM Reply Quote 0
        • D
          dr ramaanand @dr ramaanand
          last edited by Nov 21, 2024, 4:06 PM

          I tweaked the Regular expression to <footer style="[^"]*?(width: 100%; height: auto;" class=).+?>(?!\s*<div style="\1) with $0\r\n<div style="$1"container"> in the replace field which worked and it also skipped adding the <div…> line if it was added already.

          1 Reply Last reply Reply Quote 0
          • G
            guy038
            last edited by Nov 21, 2024, 4:17 PM

            Hi, @dr-ramaanand,

            Sorry, but I did not understand, at all, what you want to !


            If I paste in a new tab, these two lines, as INPUT :

            <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
            
            <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
            

            my previous regex S/R :

            • SEARCH <footer(.+?class=).+?>(?!\R<div\1)

            • REPLACE $0\r\n<div$1"container">

            Does return this OUTPUT text :

            <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
            <div style="top: 98.7%; width: 100%; height: auto;" class="container">
            
            <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
            <div style="top: 99.2%; width: 100%; height: auto;" class="container">
            

            You’ll note that the added line, beginning with <div style=", is followed, as expected, with the same text that its previous line, except for the text which comes after the class attribute and which is changed as container

            Do you need this behaviour ? If not, show me some examples ( before and after ) of what you need !


            Now, you said :

            I also observe that <footer style="width: 100%; height: auto;" class="panel-footer footer add-top"> cannot be found even if …

            But, althougth the part top: ##.#%; is missing, my regex <footer(.+?class=).+?>(?!\R<div\1) does find the string

            <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
            

            Thus, from the INPUT text :

            <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
            
            <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
            
            <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
            

            and the regex S/R :

            • SEARCH <footer(.+?class=).+?>(?!\R<div\1)

            • REPLACE $0\r\n<div$1"container">

            We get the following OUTPUT text :

            <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
            <div style="top: 98.7%; width: 100%; height: auto;" class="container">
            
            <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
            <div style="top: 99.2%; width: 100%; height: auto;" class="container">
            
            <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
            <div style="width: 100%; height: auto;" class="container">
            

            Again, if these results are NOT expected, make the effort to provide a lot of examples, which CLEARLY show what you want to !

            BR

            guy038

            D 1 Reply Last reply Nov 21, 2024, 4:30 PM Reply Quote 0
            • D
              dr ramaanand @guy038
              last edited by Nov 21, 2024, 4:30 PM

              @guy038 said in How to add a missing line, based on part of the previous line:

              <footer style=“top: 98.7%; width: 100%; height: auto;” class=“panel-footer footer add-top”>

              <footer style=“top: 99.2%; width: 100%; height: auto;” class=“panel-footer footer add-top”>

              <footer style=“width: 100%; height: auto;” class=“panel-footer footer add-top”>

              If the above is the input text, with your RegEx, the output is exactly as you showed above but I want the output in all three cases to be <div style="width: 100%; height: auto;" class="container">

              D 1 Reply Last reply Nov 21, 2024, 4:33 PM Reply Quote 1
              • D
                dr ramaanand @dr ramaanand
                last edited by dr ramaanand Nov 21, 2024, 4:37 PM Nov 21, 2024, 4:33 PM

                @guy038 …so I tweaked the Regular expression to be used in the Find field to <footer style="[^"]*?(width: 100%; height: auto;" class=).+?>(?!\s*<div style="\1) with $0\r\n<div style="$1"container"> in the replace field which added the <div.........> line and it also skipped adding the <div,…> line if it was added already.

                D 1 Reply Last reply Nov 21, 2024, 4:42 PM Reply Quote 1
                • D
                  dr ramaanand @dr ramaanand
                  last edited by dr ramaanand Nov 21, 2024, 4:51 PM Nov 21, 2024, 4:42 PM

                  @guy038 The very first solution I had provided, right on top was actually perfect but I thought the <div.............> string could be captured in a group. However, someone at regex101.com explained that SKIP is just an optimization to say, “don’t just move 1 character and try again”, it says, “move ALL these characters and try again”, so if something is skipped with a (*FAIL) or (*F), we can’t capture it in a group

                  1 Reply Last reply Reply Quote 0
                  • G
                    guy038
                    last edited by Nov 21, 2024, 5:14 PM

                    Hello, @dr-ramaanand and All,

                    Ah…, I’ve just tested your S/R and it works nicely !

                    Now, you can even simplify your S/R to this version :

                    • SEARCH <footer.+?(width.+?class=).+?>(?!\R<div style="\1)

                    • REPLACE $0\r\n<div style="$1"container">


                    Now, if, in your very first post, you had said :

                    From this INPUT text :

                    <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
                    
                    <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
                    
                    <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
                    

                    I would like this OUTPUT text :

                    <footer style="top: 98.7%; width: 100%; height: auto;" class="panel-footer footer add-top">
                    <div style="width: 100%; height: auto;" class="container">
                    
                    <footer style="top: 99.2%; width: 100%; height: auto;" class="panel-footer footer add-top">
                    <div style="width: 100%; height: auto;" class="container">
                    
                    <footer style="width: 100%; height: auto;" class="panel-footer footer add-top">
                    <div style="width: 100%; height: auto;" class="container">
                    

                    Everything would have been much more simple, you know !?

                    Best Regards,

                    guy038

                    D 1 Reply Last reply Nov 21, 2024, 5:37 PM Reply Quote 1
                    • D
                      dr ramaanand @guy038
                      last edited by Nov 21, 2024, 5:37 PM

                      @guy038 Oui, merci beaucoup!

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