想要在linux文件中替换2个字符串之间的特定单词

时间:2014-02-27 11:00:40

标签: regex linux bash sed awk

我希望在我的文件的每一行中替换每个"<TD>" with "<TH>",但只能在"<TD>Grand Total" to "</TABLE>"关键字之后,而不是在"<TD>Grand Total"关键字之前使用bash脚本。

我尝试了以下命令,但它正在替换整个文件中的关键字。请帮帮我。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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文件并执行它