如何用Perl中的另一个集替换文件中的一组单词?

时间:2008-12-09 04:33:00

标签: regex perl

我的要求是用给定的第二组单词替换给定文本文件中的一组单词,这些单词可以从命令行或另一个文件中给出。想要使用Perl执行此操作,因为我的其余代码也在Perl中。

所以,如果我有以下内容:

server name="${server1}" host="abc.com"
server name="${server2}" host="webcs.com"
server name="${server5}" host="httpvcs1.com"
server name="${server6}" host="xyz.com"
server name="${server7}" host="msg.com"

我希望用不同的单词替换字符串'server1','server2','server5'等。这些可能放在另一个文件中或从命令行给出(以更可行的方式)。

此外,如果,而不是只是'server1','server2'等,我想用'file'替换'server'字样,我将如何为这个替换制作正则表达式?

perl -pie 's/server\d{1-3}/myword/g' loginOut.txt > loginOut1.txt

以上将使用'myword'替换所有单词。但我只想要替换子串。

6 个答案:

答案 0 :(得分:2)

第二个问题的正则表达式为s/server/myword/g;。匹配(并替代)任何“服务器”的出现。

要使用不同的字符串替换server1,server2等,您可以拥有包含替换规则的文本文件,例如:

server1 abcd
server2 bcde
server3 cdef
etc.

然后,您可以将文件中的日期读入哈希值,例如

my %dict;
while(<DICTFILE>){
    /(\S+)\s+(\S+)/;
    $dict{$1}={$2};
}

然后继续更换:

while(my $line = <>){
    foreach my $s (keys %dict){
        $line =~ s/$s/$dict{$s}/g;
    }
    print $line;
}

答案 1 :(得分:1)

上述所有答案都存在一些缺陷。你问了一些方法

  

我希望用'file1','file2','file5'等替换'server1','server2','server5'等。

该命令是(在Windows提示符下的-pe,而不是-pie):

perl -pe "s/\{server/\{file/g" in.txt > out.txt

和out.txt是:

server name="${file1}" host="abc.com"
server name="${file2}" host="webcs.com"
server name="${file5}" host="httpvcs1.com"
server name="${file6}" host="xyz.com"
server name="${file7}" host="msg.com"

我相信根据您的最新评论,这正是您想要的。

答案 2 :(得分:1)

您只需要根据自己的需要尽可能多地使用它。

在这种情况下,你可以这样做:

S / {服务器/ {文件/克;

答案 3 :(得分:0)

将您的正则表达式更改为以下内容:

perl -pie 's/\{server/myword/g' loginOut.txt > loginOut1.txt

答案 4 :(得分:0)

尝试以下方法:

$what = 'server'; # The word to be replaced
$with = 'file';   # Replacement
s/(?<=\${)$what(?=[^}]*})/$with/g;

答案 5 :(得分:0)

您可能想试用Template Toolkit


以下是模板工具包Intro, Manual page 的摘录:


Template Toolkit是Perl模块的集合,它实现了一个快速,灵活,功能强大且可扩展的模板处理系统。它最常用于生成动态Web内容,尽管它可以同样用于处理任何类型的文本文档。

在最简单的层面上,它提供了一种处理模板文件的简便方法,使用等效值填充嵌入式变量引用。这是一个模板的例子。

Dear [% name %],

It has come to our attention that your account is in 
arrears to the sum of [% debt %].

Please settle your account before [% deadline %] or we 
will be forced to revoke your Licence to Thrill.

The Management.

默认情况下,模板指令嵌入在字符序列 [% ... %] 中,但您可以更改这些和其他各种选项,以配置模板工具包的外观,感觉和工作方式。您可以设置 INTERPOLATE 选项,例如,如果您希望以Perl样式嵌入变量:

Dear $name,

It has come to our attention that your account is in 
arrears to the sum of $debt.

Perldoc page