Neha
Neha

Reputation: 67

Match Pattern and Replace in HTML tags

    </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

Answers (3)

Neha
Neha

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

Arunesh Singh
Arunesh Singh

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

Ed Morton
Ed Morton

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

Related Questions