我在此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。
感谢任何帮助。
答案 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