How to add a missing line, based on part of the previous line
-
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 -
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 -
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
$1
after the\r\n
instead of typing the whole (missing) string to be addedWell, 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 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 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 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 theclass
attribute and which is changed ascontainer
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
-
-
@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!