采用 perl 脚本实现几个经常用到的功能,如删除指定字符串之间的文本内容等。
前言
本篇文章主要分享用 perl 脚本实现 3 个基础功能。
一、功能描述
下面的代码主要实现了以下 3 个功能:
① 删除以 .S
开头, 以 .E
结尾,及其中间所有的内容。
② 将所有 aa
开头的单词替换成 aa2
开头的单词。
③ 支持 命令行手动输入文本
或 添加新文件
这 2 种方式进行新内容添加。
二、代码内容
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my ($inline, $file);
GetOptions(
'inline=s' => \$inline,
'file=s' => \$file,
) or die "Invalid options\n";
# 参数检查
if (($inline && $file) || !($inline || $file)) {
die "Usage: $0 [--inline TEXT | --file FILE] files...\n";
}
# 读取插入内容
my $insert_content;
if ($inline) {
$insert_content = $inline;
} else {
open my $fh, '<', $file or die "Can't open $file: $!";
local $/;
$insert_content = <$fh>;
close $fh;
}
# 处理文件
foreach my $filename (@ARGV) {
open my $fh, '<', $filename or die "Can't open $filename: $!";
my $content = do { local $/; <$fh> }; # 显式读取到 $content
close $fh;
# 所有替换操作直接作用于 $content
$content =~ s/\.S.*?\.E//sg;
$content =~ s/\baa(\S*)/aa2$1/g;
$content =~ s/^include\s+.*$/$insert_content/gm;
# 写回文件
open my $out, '>', $filename or die "Can't write to $filename: $!";
print $out $content;
close $out;
}
三、解释说明
① 执行命令: perl script.pl --inline "INSERTED TEXT" input.txt
。即以命令行输入的方式添加 INSERTED TEXT 到 input.txt 中,并完成其他 2 项操作(删除 .S 到.E 和替换 aa 开头的单词)
② 命令行参数有 2 种选择,可以 --inline TEXT
,也可以 --file FILE
。但是不能都选择或者都不选择。代码中会进行参数合法性检查。
③ .*?
表示非贪婪匹配(尽可能少匹配)任意字符(含换行符,因s修饰符,使得 . 可匹配换行符)。如果去掉问号就是贪婪匹配(尽可能多匹配)。
④ \baa
表示匹配以 aa 开头的单词边界,$1
表示正则表达式中第 1 个捕获组(第 1 个括号)匹配到的内容,即捕获 aa 后续非空字符并保留。若匹配失败,$1 是 undef。$0
指当前运行的脚本文件名。
⑤ $/
是 perl 的一个特殊变量,称为输入记录分隔符,默认是换行符。do local
语句通过将 $/ 设置为 undef
, 让 perl 一次性读取整个文件内容,直到文件末尾。这样,< $fh >
就会返回文件的全部内容,而不是单行。
⑥ 匹配所有以 include 开头的行,整行替换为指定内容。这里也可以直接简化成使用 .
直接连接字符串。
四、调试提醒
① 若提示 unknown option
。请检查参数格式为 --inline 或者 --file。
② 若提示 use of uninitialized value
。请检查正则表达式替换相关语句完全与展示代码相同,包括空格(如 =~ )。
③ 若运行后文件没有被修改,但是也没有打印 error log
。请检查命令格式,确认脚本能够找到相应的输入文件(且该文件有对应格式的内容,如 .S 到 .E等)。
总结
本文章感谢 DeepSeek 的大力支持,文章内容不得用于商业用途,仅做学习交流。