我的要求是用给定的第二组单词替换给定文本文件中的一组单词,这些单词可以从命令行或另一个文件中给出。想要使用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'替换所有单词。但我只想要替换子串。
答案 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.