perl更新/修改/删除文本文件内容
方法一:脚本更新
更新大量文件
更新文件最常用的方法是写一个和以前的文件相似的新文件,我们可以根据的需要进行修改。如你所知,这和对同一个文件上进行更新的结果类似,但上述方法有一些副作用。
本例中,我们有相似格式的上百个文件。其中一个是fred03.dat,如下:
以下是引用片段: Promram name: granite Author: Gilbert Bates Company: RockSoft Department: R&D Phone: +1 503 555-0095 Date: Tues March 9, 2004 Version: 2.1 Size: 21k Status: Final beta我们希望修改这个文件,使之含有不同的信息。下面是我们希望修改后它所呈现的样式: Program name: granite Author: Randal L. Schwartz Company: RockSoft Department: R&D Date: June 12, 2008 6:38 pm Version: 2.1 Size: 21k Status: Final beta |
简言之,我们需要在3 个地方进行修改。作者(Author)的名字需要更改,日期(Date)需要更新,电话(Phone)需要删除。我们需要在上百个这样的文件中作这些修改。
Perl 可以通过尖括号操作符(<>)对文件进行修改。下面程序能完成我们希望的工作,虽然第一次看时,不是很明显。这个Perl 语言入门(第四版)
程序只有一个新的特性:特殊变量$^I;现在可以不用管它,我们将在后面讨论:
以下是代码片段:
#! /usr/bin/perl -w
use strict;
chomp(my $date = ‘date’);
$^I =“.bak”;
while(<>){
s/^Author:.*/Author: Randal L. Scharwartz/;
s/^Phone:.*\n//;
s/^Date:.*/Date: $date/;
print;
}
由于需要当前的日期,因此在程序开端使用了系统命令:date。另一种获得时间的更好的方法是(格式有些不同)使用Perl自带的localtime 函数,其在标量context 中使用:
以下是代码片段: my $date = localtime; |
下一行是给$^I 赋值,我们现在不讨论它。
根据我们现在所知的,上述操作的结果是文件中新修改的部分被输出到终端,内容快速滚动,但文件本身不会被修改。由尖括号操作(<>)所得到的文件列表来源于命令行。主循环读入,更新,输出每一行。(根据我们现在所知的,上述操作的结果是文件中被修改的部分被输出到终端,这些内容快速滚动,但文件本身不会被修改。)第二个替换操作将含有电话(phone)号码的整行由空串替换,连换行符一起替换掉。这行输出时,什么也不会出现,就像电话(Phone)号码从没存在过一样。还有大量的行不会被这三个模式所匹配,他们在输出时不会有任何更改。
结果接近于我们所期望的了,除了还不知道怎样将更新的信息写回文件。答案是变量$^I。默认时为undef,此时没有什么
特殊的地方。但给它设置某些串时,它使尖括号操作(<>)变得有些特殊。
我们知道尖括号(<>)的神奇特点:如果没有指定文件名,则其从标准输入流中自动打开和关闭一系列文件进行读入。但如果$^I 中有字符串,这个字符串则会成为备份文件的扩展名。我们在下面仔细讨论。
我们假设此时尖括号(<>)打开的文件是fred03.dat。它像以前那样打开它,但进行了重名名,把它叫做fred03.dat.bak。这很好,因为不在使用之前的名字。现在<>将这个新的文件作为默认的输出,因此任何内容将输出到那个文件中。while循环会从旧的文件中读入一行,更新它,再把它输出到新文件中。在一台普通的机器上运行这个程序,几秒钟就能更新上百个文件。非常强大,不是吗?
方法二:命令行更新
以下是代码片段: perl -i.bak -wpe "s/^\s*#\s*Port.*22/Port 55667/g" /etc/ssh/sshd_config |
建议继续学习:
- perl大牛flw传说 (阅读:6525)
- perl模块Getopt::Std用法及实例-从命令行读取参数模块 (阅读:5941)
- [Perl] Template::Toolkit 模板技术. (阅读:5385)
- 在perl中连接和使用sqlite做数据存储 (阅读:5111)
- Perl命令行常见用法及技巧 (阅读:4870)
- perl模块之MIME::Lite发送有附件的邮件 (阅读:4460)
- perl的expect使用方法,实现非交互式登录。 (阅读:4547)
- Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (阅读:4497)
- perl大牛唐凤传说 (阅读:4287)
- SED命令行脚本快速参考,AWK命令行脚本快速参考,perl命令行脚本快速参考 (阅读:3826)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:lazysa 来源: 懒人运维
- 标签: perl 更新
- 发布时间:2009-11-10 23:02:03
- [69] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [62] find命令的一点注意事项
- [62] android 开发入门
- [62] Go Reflect 性能
- [60] 流程管理与用户研究
- [58] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] Oracle MTS模式下 进程地址与会话信