我正在尝试匹配文本文件中的文件路径,并将其替换为共享文件路径。例如。我要用"X:\Group_14\Project_Security"
替换字符串"\\Project_Security$"
。
我在解决语法方面遇到了问题,因为我使用反斜杠(\
)来逃避另一个反斜杠(\\
),但这似乎不适用于匹配文本文件中的路径。
open INPUT, '< C:\searchfile.txt';
open OUTPUT, '> C:\logsearchfiletest.txt';
@lines = <INPUT>;
%replacements = (
"X:\\Group_14\\Project_Security" => "\\\\Project_Security\$",
...
(More Paths as above)
...
);
$pattern = join '|', keys %replacements;
for (@lines) {
s/($pattern)/@{[$replacements{$1}]}/g;
print OUTPUT;
}
由于"\\\\Project_Security\$"
正确显示为\\Project_Security$"
,因此无法确定发生了什么。
所以我认为问题在于"X:\\Group_14\\Project_Security"
没有评估到
因此"X:\Group_14\Project_Security"
正确地在文本文件中不匹配?
任何有关此事的建议都将受到赞赏,干杯。
答案 0 :(得分:1)
如果所有文件路径和替换都采用与您的示例类似的格式,您应该只能执行以下操作,而不是使用哈希来查找替换:
for my $line (@lines) {
$line =~ s/.+\\(.+)$/\\\\$1\$/;
print OUTPUT $line;
}
答案 1 :(得分:1)
一些注意事项:
尝试:
#!/usr/bin/env perl
use strict;
use warnings;
# --------------------------------------
use charnames qw( :full :short );
use English qw( -no_match_vars ); # Avoids regex performance penalty
use Data::Dumper;
# Make Data::Dumper pretty
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 1;
# Set maximum depth for Data::Dumper, zero means unlimited
local $Data::Dumper::Maxdepth = 0;
# conditional compile DEBUGging statements
# See http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html
use constant DEBUG => $ENV{DEBUG};
# --------------------------------------
# place file names in variables to they are easily changed
my $search_file = 'C:\\searchfile.txt';
my $log_search_file = 'C:\\logsearchfiletest.txt';
my %replacements = (
"X:\\Group_14\\Project_Security" => "\\\\Project_Security\$",
# etc
);
# use the 3-argument open as a security precaution
open my $search_fh, '<', $search_file or die "could not open $search_file: $OS_ERROR\n";
open my $log_search_fh, '>', $log_search_file or die "could not open $log_search_file: $OS_ERROR\n";
while( my $line = <$search_fh> ){
# scan for replacements
while( my ( $pattern, $replacement ) = each %replacements ){
$line =~ s/\Q$pattern\E/$replacement/g;
}
print {$log_search_fh} $line or die "could not print to $log_search_file: $OS_ERROR\n";
}
# always close the file handles and always check for errors
close $search_fh or die "could not close $search_file: $OS_ERROR\n";
close $log_search_fh or die "could not close $log_search_file: $OS_ERROR\n";
答案 2 :(得分:0)
我看到你在这里发布了生锈的Perl代码,多么尴尬。 ;)我今天早些时候更新了我在原始PowerShell线程中的答案,该线程提供了一个更通用的解决方案,它也处理正则表达式元字符,并且不需要您手动转义600个哈希元素中的每一个:PowerShell multiple string replacement efficiency。我在原始问题中添加了 perl 和正则表达式标记,但我的编辑尚未获得批准。
[正如我所提到的,因为我最近一直在使用PowerShell进行所有操作(哎呀,这些天我用PowerShell准备早餐......),我的Perl已经变得有点尘土飞扬,我看到它没有消失这里没有注意到:P我修复了一些我注意到的东西,当我第二次看到它时可以更好地编码,这些都在底部注明。我不打扰错误消息和声明以及其他有限使用快速和脏脚本的详细程度,我不特别推荐它。正如Perl的座右铭所说的那样,“让事情变得轻松而艰难”。好吧,这是一个简单易事的案例,Perl的一个主要优点是,当你试图做一些快速而简单的事情时,它不会强迫你“适当”。但我确实关闭了文件句柄。 ;)