How to add a missing line, based on part of the previous line
-
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.
-
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
$1after the\r\ninstead of typing the whole (missing) string to be addedWell, no need to build a regex which uses
Backtracking Controlverbs 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 aroundoption
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 Allbutton, 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 Allaction, 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$1in the Replace fieldTo 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 Allbutton, any subsequent click on this button will display, as 'expected, the message :Replace all: 0 occurrence were replaced in entire fileThis ensures that the replacement just occurs once !
Remark :
- In the search regex, you may replace the
\1syntax, 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
$1or${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 partspace+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
-
-
@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
-
@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 -
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. -
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 theclassattribute and which is changed ascontainerDo 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
-
-
@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"> -
@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. -
@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 -
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
-
-
@guy038 Oui, merci beaucoup!
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