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

标签 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

最佳答案

这可能不是最好的答案,但以下 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文件并执行

关于regex - 想要替换linux文件中2个字符串之间的特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066475/

相关文章:

用于递归搜索和重命名的 Bash 脚本

bash - curl: (26) 当文件是变量时无法打开文件

ruby - 如何从 Ruby 中的字符串中去除括号?

Python正则表达式获取组位置

linux - 使用双 ssh 从服务器下载文件

c - 我如何遍历 bash 中的位置变量?

linux - 检测用户空间模块是否从 Linux 驱动程序意外死亡

linux - 如何在 CentOS 上不注销/登录的情况下刷新 session ?

regex - 为什么我的 HTML5 表单验证模式 (/^\S{6,}$/) 触发不正确?

Javascript 正则表达式 : why groups with one syntax, 而不是其他