Reputation: 67
</tr>
<tr class='htmllist_tr' style="background-color:yellow" ><td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.13</td>
<td class='htmllist_td' >NehaA9.86</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >8</td>
<td class='htmllist_td' >NehaA5.12</td>
</tr>
Want to find NehaA between <tr>
and </tr>
tags then change
`<tr class='htmllist_tr'>`
or
<tr class='htmllist_tr' style="background-color:yellow">
to
`<tr class='htmllist_tr' style="background-color:red">` *
tried this
sed -e "/NehaA/ s/\'<tr class='htmllist_tr'>\'/\'<tr class='htmllist_tr' style="background-color:red">\'/ ;" 2932_TABLE2.txt
didn't work please help
Upvotes: 0
Views: 102
Reputation: 67
@ED ..sorry for the cofusion ..this is the original file
<table class='htmllist'>
<tr class='htmllist_tr' ><th class='htmllist_th' >TABLESPACE<br>NAME</th>
<th class='htmllist_th' >ALLOCATED<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>PCT</th>
<tr class='htmllist_tr' style="background-color:yellow" ><td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.78</td>
<td class='htmllist_td' >NehaA9.93</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >TEMP</td>
<td class='htmllist_td_nbr' >125</td>
<td class='htmllist_td_nbr' >124.63</td>
<td class='htmllist_td_nbr' >99.7</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >TEMP_EDDDATA</td>
<td class='htmllist_td_nbr' >205.99</td>
<td class='htmllist_td_nbr' >198.52</td>
<td class='htmllist_td_nbr' >96.37</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >22.85</td>
<td class='htmllist_td' >NehaA14.62</td>
</tr>
</table>
I Want output like
<table class='htmllist'>
<tr class='htmllist_tr' ><th class='htmllist_th' >TABLESPACE<br>NAME</th>
<th class='htmllist_th' >ALLOCATED<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>PCT</th>
<tr class='htmllist_tr' style="background-color:red" ><td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.78</td>
<td class='htmllist_td' >NehaA9.93</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >TEMP</td>
<td class='htmllist_td_nbr' >125</td>
<td class='htmllist_td_nbr' >124.63</td>
<td class='htmllist_td_nbr' >99.7</td>
</tr>
<tr class='htmllist_tr' ><td class='htmllist_td' >TEMP_EDDDATA</td>
<td class='htmllist_td_nbr' >205.99</td>
<td class='htmllist_td_nbr' >198.52</td>
<td class='htmllist_td_nbr' >96.37</td>
</tr>
<tr class='htmllist_tr' style="background-color:red"><td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >22.85</td>
<td class='htmllist_td' >NehaA14.62</td>
</tr>
</table>
however when I am using this
awk -v RS='</tr>\\s*' '/Neha/{ORS=RT; sub(/<tr[^>]+>/,""); print "<tr class=\047htmllist_tr\047 style=\"background-color:red\">" $0}' text.txt
this is giving me output like this
<tr class='htmllist_tr' style="background-color:red"><table class='htmllist'>
<th class='htmllist_th' >TABLESPACE<br>NAME</th>
<th class='htmllist_th' >ALLOCATED<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>GB</th>
<th class='htmllist_th' >CURRENT<br>FREE<br>SPACE<br>PCT</th>
<tr class='htmllist_tr' style="background-color:yellow" ><td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.78</td>
<td class='htmllist_td' >NehaA9.93</td>
</tr><tr class='htmllist_tr' style="background-color:red">
<td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >22.85</td>
<td class='htmllist_td' >NehaA14.62</td>
</tr>
let me know if this make sense
Upvotes: 0
Reputation: 3535
Here is my way using HTML::TreeBuilder
. The code itself is self exaplanatory. I will suggest you to read the documentations as it is not recommended to parse HTML using regex
.
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TreeBuilder;
my $str = <<'HTML'
<html>
<head>
</head>
<body>
<table>
<tr class='htmllist_tr' style="background-color:yellow" >
<td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.13</td>
<td class='htmllist_td' >NehaA9.86</td>
</tr>
<tr class='htmllist_tr' >
<td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >8</td>
<td class='htmllist_td' >NehaA5.12</td>
</tr>
</table>
</body>
</html>
HTML
;
my $root = HTML::TreeBuilder->new_from_content($str);
my @tr = $root -> find_by_tag_name('tr');
foreach (@tr) {
if ($_ -> find_by_attribute("class","htmllist_tr")) {
my @tds = $_ -> look_down(_tag => 'td', class => 'htmllist_td');
my @children = map {$_ -> content_list} @tds;
if(grep(/NehaA/, @children)) {
$_ -> attr('style', 'background-color:red');
}
}
}
print $root -> as_HTML(undef, " ");
Upvotes: 0
Reputation: 203674
If you don't get a usable answer using an HTML parser then try this:
$ awk -v RS='</tr>\\s*' '/Neha/{ORS=RT; sub(/<tr[^>]+>/,""); print "<tr class=\047htmllist_tr\047 style=\"background-color:red\">" $0}' file
<tr class='htmllist_tr' style="background-color:red"><td class='htmllist_td' >INDX01</td>
<td class='htmllist_td_nbr' >964.87</td>
<td class='htmllist_td_nbr' >95.13</td>
<td class='htmllist_td' >NehaA9.86</td>
</tr>
<tr class='htmllist_tr' style="background-color:red"><td class='htmllist_td' >UNDOTBS1</td>
<td class='htmllist_td_nbr' >156.25</td>
<td class='htmllist_td_nbr' >8</td>
<td class='htmllist_td' >NehaA5.12</td>
</tr>
It uses GNU awk for multi-char RS and RT.
Upvotes: 1