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

This topic has been deleted. Only users with topic management privileges can see it.

  • D

    dr ramaanand

    last edited by guy038


    Strings:-
    Before:-
    <footer style=“width: 100%; height: auto;” class=“panel-footer footer add-top”>
    After:-
    <footer style=“width: 100%; height: auto;” class=“panel-footer footer add-top”>
    <div style=“width: 100%; height: auto;” class=“container”>

    (?s)((panel-footer footer add-top">)\s*(<div style="width: 100%; height: auto;" class="container">)(*SKIP)(*F))|panel-footer footer add-top">

    helped find the string just above/before the missing string, with the Regular expression mode selected and I added the missing string <div style="width: 100%; height: auto;" class="container"> just below that on the next line by using $0\r\n<div style="width: 100%; height: auto;" class="container"> in the, “Replace in files” field. However, I want to know how to use a $1 after the \r\n instead of typing the whole (missing) string to be added

    D1 ReplyLast reply ReplyQuote0

    • D

      dr ramaanand @dr ramaanand

      last edited by dr ramaanand


      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

      D1 ReplyLast reply ReplyQuote0

      • D

        dr ramaanand @dr ramaanand

        last edited by dr ramaanand


        I think this page should have been titled, “How to find out if a string is missing after another dissimilar string and add it after that dissimilar string, if it is missing ?” but I don’t know how to change the title.

        1 ReplyLast reply ReplyQuote0

        • G

          guy038

          last edited by guy038


          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

          D1 ReplyLast reply ReplyQuote0

          • D

            dr ramaanand @guy038

            last edited by


            @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

            D1 ReplyLast reply ReplyQuote0

            • D

              dr ramaanand @dr ramaanand

              last edited by dr ramaanand


              @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

              D1 ReplyLast reply ReplyQuote0

              • D

                dr ramaanand @dr ramaanand

                last edited by


                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 ReplyLast reply ReplyQuote0

                • G

                  guy038

                  last edited by


                  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

                  D1 ReplyLast reply ReplyQuote0

                  • D

                    dr ramaanand @guy038

                    last edited by


                    @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">

                    D1 ReplyLast reply ReplyQuote1

                    • D

                      dr ramaanand @dr ramaanand

                      last edited by dr ramaanand


                      @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.

                      D1 ReplyLast reply ReplyQuote1

                      • D

                        dr ramaanand @dr ramaanand

                        last edited by dr ramaanand


                        @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 ReplyLast reply ReplyQuote0

                        • G

                          guy038

                          last edited by


                          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

                          D1 ReplyLast reply ReplyQuote1

                          • D

                            dr ramaanand @guy038

                            last edited by


                            @guy038 Oui, merci beaucoup!

                            1 ReplyLast reply ReplyQuote0

                            • How to add a missing line, based on part of the previous line (2024)

                              References

                              Top Articles
                              Latest Posts
                              Recommended Articles
                              Article information

                              Author: Dong Thiel

                              Last Updated:

                              Views: 5739

                              Rating: 4.9 / 5 (79 voted)

                              Reviews: 94% of readers found this page helpful

                              Author information

                              Name: Dong Thiel

                              Birthday: 2001-07-14

                              Address: 2865 Kasha Unions, West Corrinne, AK 05708-1071

                              Phone: +3512198379449

                              Job: Design Planner

                              Hobby: Graffiti, Foreign language learning, Gambling, Metalworking, Rowing, Sculling, Sewing

                              Introduction: My name is Dong Thiel, I am a brainy, happy, tasty, lively, splendid, talented, cooperative person who loves writing and wants to share my knowledge and understanding with you.