2014-02-27 34 views
2

我想在我的文件的每一行中替换每个"<TD>" with "<TH>",但仅在"<TD>Grand Total" to "</TABLE>"关键字之后,而不是在"<TD>Grand Total"关键字之前,用bash脚本来替换。想要替换linux文件中的两个字符串之间的特定字

我想下面的命令,但它是替换整个文件的关键字。请帮帮我。

awk 'match($0,"<TD>Grand.*"){print substr($0,RSTART)}' myfile.txt | sed -i 's/TD/TH/g' myfile.txt 

样本数据低于

<br><br>Book Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>30</TD><TD>product2><TD>45</TD></TR><TR><TD>Grand Total</TD><TD>75</TD></TR></TABLE> 

<br><br>Shoe Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>20</TD><TD>product2><TD>60</TD></TR><TR><TD>Grand Total</TD><TD>80</TD></TR></TABLE> 

<br><br>Apparel Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>60</TD><TD>product2><TD>40</TD></TR><TR><TD>Grand Total</TD><TD>100</TD></TR></TABLE> 

所需数据样本:

<br><br>Book Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>30</TD><TD>product2><TD>45</TD></TR><TR><TH>Grand Total</TH><TH>75</TH></TR></TABLE> 

<br><br>Shoe Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>20</TD><TD>product2><TD>60</TD></TR><TR><TH>Grand Total</TH><TH>80</TH></TR></TABLE> 

<br><br>Apparel Inventory Report <br><br> 
<TABLE BORDER=1><TR><TH>product</TH><TH>Quantity</TH></TR><TR><TD>product1><TD>60</TD><TD>product2><TD>40</TD></TR><TR><TH>Grand Total</TH><TH>100</TH></TR></TABLE> 

myfile.txt

+0

您能给出一个示例输入以使其更清楚吗?样本要求的输出也会有所帮助。 – fedorqui

+0

是的,你可以检查myfile.txt的链接 –

+1

尝试发布遵循一定的问题http://stackoverflow.com/help/mcve – fedorqui

回答

2

这可能不是最好的答案,但下面的Perl代码段应该帮助:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

open (INPUTFILE, "mytext.txt") or die ("Unable to find the file"); 
open (OUTFILE, ">output") or die ("Unable to find the file"); 
my @lines = <INPUTFILE>; 
foreach my $str (@lines) { 
     if (my ($matches) = $str =~ /(<TD>Grand Total<\/TD>(<TD>-?[0-9.]+<\/TD>)*)/) { 
       my $orig = $matches; 
       $matches =~ tr/TD/TH/ ; 
       $str =~ s/$orig/$matches/; 
       print OUTFILE $str; 
     }else{ 
       print OUTFILE $str; 
     } 

} 

一个新的文件“产出”应你正在寻找的数据来创建为

保存上面的.pl文件并执行它

+0

我可以将上面的代码保存在.sh文件中并执行它..我应该更新我的文件名假设它是myfile.txt ..它将被替换为INPUTFILE或其他。请建议。 –

+0

上面是一个Perl代码片段。请将“sample”替换为文件路径:open(INPUTFILE,“sample”)或die(“Unable to find the file”); –

+0

根据您的文件名称编辑上面的代码...复制代码并将其粘贴到文件中,声明为replace_tag.pl ..并通过运行'perl replace_tag来执行它。PL' –

2

这是你需要的吗?

sed -i.bak s/"Grand Total"/NEW_STRING/g myfile.txt 

编辑

我已经回答您编辑的问题之前。在您的情况,您可以:

sed -i.bak s/"Grand Total\<\/TD\>\<\/TD\>"/"Grand Total\<\/TH\>\<\/TH\>"/g myfile.txt 
sed -i.bak s/"\<\/TD\>\<\/TR\>\<\/TABLE\>"/"\<\/TH\>\<\/TR\>\<\/TABLE\>"/g myfile.txt 
+0

的要求是不同的......这将取代“总计”到“新字符串”,而我要替换“TD” TO“TH”,但只有在“总计” ... –

+0

抱歉迟到..我已编辑回答 – SirDeveloper

+0

嗨,首先感谢您的答复.. TD标记与总计和TABLE很容易改变,但我的问题是改变他们之间的TD标签,这些是可变的,因为值之间会改变结果由mysql查询提供。 –

相关问题