考虑以下两个文件。
File1中:
Name : John Paul
Address: 243, First Floor,
XYZ - 12345.
Phone : 555 444 3333
Name : Mison
Address: some address like above
Phone: 444 333 2222
文件2:
Name: John Paul
Address: 243, First Floor,
XYZ - 12345.
Phone: 555 444 3333
我正在使用Perl。假设我从File2读取第一个Name-to-Phone块并将其存储在$var_file2
中(通过逐行读取连接)。 File1的内容存储在$var_file1
(slurped)中。考虑我需要将File2中的整个Name-to-Phone块与File1中的块进行比较,并将匹配替换为另一个字符串。我在quotemeta
上使用了$var_file2
函数,因为模式匹配并没有这样做。
$q_var_file2 = quotemeta($var_file2);
$replace = "replace_text";
$var_file1 =~ s/$q_var_file2/$replace/s;
现在,当模式完全匹配时,上面的代码可以正常工作。但是在执行模式匹配和替换时需要忽略的单词/字符之间的文件1或文件2中可能是附加的或没有空格。
我尝试使用仅匹配非空白区域的\S
。但我想我错过了什么。我甚至尝试使用变量而不对它们应用quotemeta
。
答案 0 :(得分:1)
嗯,你只想用$var_file2
替换\s+
中所有连续的空格序列,同时确保所有其他字符都通过quotemeta
。
$q_re_file = join q{\s+}, map {quotemeta} split /\s+/, $var_file2;
或
$q_re_file = join q{\s+}, map quotemeta, $var_file2 =~ /\S+/g;
或
$q_re_file = $var_file2;
$q_re_file =~ s/(\S+)/quotemeta $1/ge;
$q_re_file =~ s/\s+/\\s+/g;
等。等
并使用$q_re_file
作为正则表达式。