在Perl中失败的工作RegEx找到&替换单线

时间:2014-05-18 03:16:29

标签: regex perl

我在此HTML中有以下与(<th>Password<\/th>\s*<td>)\w*(<\/td>)匹配的RegEx <th>Password</th><td>root</td>

<tr>
    <th>Password</th>
    <td>root</td>
</tr>

但是,此终端命令无法找到匹配项:

perl -pi -w -e 's/(<th>Password<\/th>\s*<td>)\w*(<\/td>)/$1NEWPASSWORD$2/g' file.html

它似乎与</th><td>之间的空白有关,但<\/th>\s*<td>在RegEx中有效,为什么不在Perl中呢?

尝试用\s*代替\n*\r*\t*及其各种组合,但仍无法匹配。

可以看到一个工作示例here

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

替换仅一次应用于文件的一行。

您可以使用-0选项一次性阅读整个文件,例如

perl -w -0777 -pi -e 's/(<th>Password<\/th>\s*<td>)\w*(<\/td>)/$1NEWPASSWORD$2/g' file.html

请注意,最好使用适当的HTML解析器(例如HTML::TreeBuilder::XPath)来处理这样的数据,因为很难说明所有可能的表示形式。使用正则表达式给出HTML构造。

答案 1 :(得分:2)

Perl一次评估一行文件,在你的例子中你试图匹配两行,所以perl永远不会找到它在第一行寻找的字符串的结尾,而且从不找到它在第二行寻找的行的开头。

您可以暂时将file.html压缩为一行(如果文件的小/性能不那么重要,可能会有效)或者您需要编写更复杂的逻辑来跟踪找到它的线条。

尝试搜索多行regex perl&#39; :)

答案 2 :(得分:2)

您可以使用sed执行此操作:

 sed -i '/<th>Password<\/th>/{n;s!<td>[^<]*!<td>NEWPASSWORD!}' file.html

另一个sed版本:

 sed -i '/<th>Password<\/th>/!b;n;s/<td>[^<]*/<td>NEWPASSWORD/' file.html