Perl inline replace only on 1st line

I have file file_1.out which contains the data below

<tr> MAIL # 1 TO src_1 </tr> 
<tr><td class="hcol">col_id</td> <td class="hcol">test_dt</td> <td class="hcol">user_type</td> <td class="hcol">ct</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">A</td> <td class="bwcol">15</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">B</td> <td class="bwcol">90</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">C</td> <td class="bcol">6</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">D</td> <td class="bcol">4</td></tr> 

How can I replace only the first line with the following:

<tr><td colspan="4" class="hcol"> MAIL # 1 TO src_1 </td></tr> 
<tr><td class="hcol">col_id</td> <td class="hcol">test_dt</td> <td class="hcol">user_type</td> <td class="hcol">ct</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">A</td> <td class="bwcol">15</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">B</td> <td class="bwcol">90</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">C</td> <td class="bcol">6</td></tr> 
<tr><td class="bcol">1</td> <td class="bcol">2012-09-20</td> <td class="bcol">D</td> <td class="bcol">4</td></tr> 

For now I am replaciong inline:

find file_1.out -type f | xargs perl -pi -e 's/<tr> MAIL #/<tr><td colspan="4" class="hcol"> MAIL #/gi; s/ <\/tr>/<\/td><\/tr>/gi'

But I dont want to use the MAIL tag in the command, if it appears agian some where in the file it does'nt work.

Thanks for your help.

This should replace only on first line in each file:

find file_1.out -type f | xargs perl  -pi -e '$.==1&&s/<tr> MAIL #/<tr><td colspan="4"  class="hcol"> MAIL #/gi; s/ <\/tr>/<\/td><\/tr>/gi'
1 Like

Similarly how can we select only the last line?

It requires some changes to the way you edit the file (you have to load whole file as one line):

find file_1.out -type f | xargs perl -i -p0e 's/<tr> MAIL #(.*)$/<tr><td colspan="4" class="hcol"> MAIL #$1/gi; s/ <\/tr>/<\/td><\/tr>/gi'
1 Like

Or:

| xargs perl -i -pe 'if(eof){s/...........'

Or you may use sed too:
For substituting in first line: sed -i '1s///g'

For substituting in last line: sed -i '$s///g'

1 Like