找回密码
 注册
查看: 8895|回复: 0

perl语言正则表达式在命令行中进行修改

[复制链接]
发表于 2011-11-14 20:57:42 | 显示全部楼层 |阅读模式
前一节的例子是非常容易写的。但Larry 觉得它还不是特别的简单。
想象你需要更新上百个文件,这些文件中Randal 拼写错误,多写了一个l:Randall。你可以写一个类似于前面的程序。或
者在命令行中使用下面的一行程序:
$perl –p –i.bak –w –e ‘s/Randall/Randal/g’fred*.dat
Perl 有完整的命令行选项,通过它们只需在命令行中输入几个字符,就能构建一个完整的程序◆。我们来分析上述程序做
了些什么。
◆查看perlrun 了解完整的选项列表。
开始的命令perl 同文件顶端的#! /usr/bin/perl 一样:它是指使用perl 程序来处理后面的部分。
-p 要求Perl 为你写一个程序。它算不上是一个完整的程序;看起来有些像下面的◆:
◆print 出现在continue 块中。查看perlsyn 和perlrun 的帮助手册了解更多信息。
while(<>){
print;
}
如果想更少,可以使用–n 替代;它会自动省略掉print 语句,你可以只输出你感兴趣的部分。( awk 的粉丝(fans)知道–p 和
–n。)再声明一次,它算不上是一个完整的程序,但能省略掉大量的输入。
下一个选项是–i.bak,它在程序开始处将$^ I 的值设置为“.bak”。如果不需要备份文件,可以使用-i 参数,后不接任何
的扩展名。如果不需要多余的降落伞,则可只在飞机上留下一个。(if you don't want a spare parachute, you can leave the airplane
with just one.)(这里仅是一个比喻,译者注)
我们已经见过–w: 作用是将警告打开。

-e 选项涵义是“执行下面的代码。”即是说s/Randall/Randal/g 字符串被当作Perl 代码执行。由于我们有while 循环(-p 选
项),这段代码被放在循环内,print 之前。由于技术上的理由,-e 代码中最后一个分号是可省略的。如果有多个-e 选项,
因此有多块代码,只有最后一个分号是可省略的。
最后一个参数是fred*.dat,它指定@ARGV 应当包含匹配上此模式的文件名。这几部分综合起来,就是一个大致如下的程
序,输入为匹配上fred*.dat 的文件:
#! /usr/bin/perl –w
$^I =“.bak”;
while(<>){
s/Randall/Randal/g;
print;
}
将这个程序和前面的程序进行比较,可以发现它们是非常相似。这些命令行的选项是非常方便的,对吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 14:31 , Processed in 0.030218 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表