如何将sed命令整合至Perl脚本?附具体场景需求
把sed命令整合到Perl脚本的方案
嘿,我懂你刚接触Perl的迷茫——明明会用sed处理文本,但要转成Perl代码就有点摸不着头脑。咱们直接把那三个sed操作改成纯Perl实现,既避免调用外部命令的麻烦,也让脚本更健壮~
先理清楚你的sed需求对应的Perl替换逻辑
你的三个sed命令都是对文本做行级替换,Perl的正则表达式处理完全能搞定,而且更灵活:
给每一行开头添加
20181230,
sed命令是1,$s/^/20181230,/g,对应Perl的多行模式替换:$string =~ s/^/20181230,/mg;这里的
m修饰符让^匹配每一行的开头,g表示全局替换(不过这里每行只匹配一次,g其实可以省略,但加上也没问题)。删除特定格式的日期时间字符串
sed命令是1,$s/,2018-12-3[0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]+0000//g,Perl里可以简化成:$string =~ s/,2018-12-3[0-9]T\d{2}:\d{2}:\d{2}\+0000//g;用
\d代替[0-9]更简洁,\d{2}表示连续两位数字,\+转义加号避免被当作正则量词。保留三位大写字母,去掉后面的数值部分
sed命令是1,$s/\([A-Z][A-Z][A-Z]\),[0-9]*\.[0-9][0-9][0-9][0-9]/\1/g,Perl里写成:$string =~ s/([A-Z]{3}),\d*\.\d{4}/$1/g;[A-Z]{3}等价于三个[A-Z],$1对应捕获到的三位字母(Perl替换里用$n而不是\n)。
修改后的完整Perl脚本
直接在你现有脚本里插入这三个替换步骤,不用再调用system执行sed,而且能避免外部命令的路径、变量插值等问题:
use strict; use warnings; use HTML::FormatText; use LWP::Simple; my $dateField = 'date=2018-12-31'; my $currency = "USD"; my $filename = 'C:\Users\My.Name\Downloads\doc3.txt'; my $address = "my.url"; my $content = get($address); defined $content or die "Cannot read '$address': $!"; # 把HTML转成纯文本 my $string = HTML::FormatText->format_string( $content, leftmargin => 5, rightmargin => 75, ); # 执行三个文本替换操作(替代原来的sed命令) # 1. 给每一行开头添加20181230, $string =~ s/^/20181230,/mg; # 2. 删除指定格式的日期时间串 $string =~ s/,2018-12-3[0-9]T\d{2}:\d{2}:\d{2}\+0000//g; # 3. 保留三位大写字母,移除后面的数值部分 $string =~ s/([A-Z]{3}),\d*\.\d{4}/$1/g; # 保存处理后的文本到文件 open(my $file, '>', $filename) or die $!; print $file $string; close($file); # 记得关闭文件句柄,确保内容写入 print "文本处理完成,已保存到 $filename\n";
额外说明
- 原来的
system调用里有个小坑:你用了双引号包裹$cmd,里面的$s会被Perl替换成你定义的1,导致sed只处理第一行,这肯定不是你想要的——用Perl内部替换就完全避免了这种变量插值的问题。 - 如果之后需要处理其他日期或格式,直接修改正则里的对应部分就行,比sed更易读和维护。
内容的提问来源于stack exchange,提问作者Philip Ankrah
相关产品推荐
相关产品推荐

