Regex 在Perl查找中失败的工作正则表达式&;更换一个衬垫

Regex 在Perl查找中失败的工作正则表达式&;更换一个衬垫,regex,perl,Regex,Perl,我有以下正则表达式(Password\s*)\w*(),它与此HTML中的Passwordroot匹配: <tr> <th>Password</th> <td>root</td> </tr> 密码 根 但是,此终端命令无法找到匹配项: perl -pi -w -e 's/(<th>Password<\/th>\s*<td>)\w*(<\/td>)/$1NE

我有以下正则表达式
(Password\s*)\w*()
,它与此HTML中的
Passwordroot
匹配:

<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
perl-pi-w-e's/(Password\s*)\w*()/$1NEWPASSWORD$2/g'file.html
它似乎与
之间的空格有关,但是
\s*
在正则表达式中工作,那么为什么不在Perl中工作呢

已尝试用
\s*
替换
\n*
\r*
\t*
及其各种组合,但仍然不匹配

可以看到一个有效的例子


任何帮助都将不胜感激。

Perl一次计算一行文件,在您的示例中,您试图匹配两行以上的内容,因此Perl永远不会在第一行找到它要查找的字符串的结尾,也不会在第二行找到它要查找的行的开头

您可以将file.html临时展平到一行(如果文件的大小/性能不是很重要,这可能会起作用),或者需要编写更复杂的逻辑来跟踪找到的行


尝试搜索“multiline regex perl”:)

替换一次只应用于文件的一行

您可以使用
-0
选项一次读入整个文件,如下所示

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

请注意,最好使用适当的HTML解析器,例如,处理这样的数据,因为很难使用正则表达式解释给定HTML构造的所有可能表示形式。

您可以使用sed来完成以下操作:

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

sed-i'/Password/{n;s![^谢谢道格拉斯。我会投票支持你的答案,但我的声誉还不够好!别担心-我希望这会有帮助。@Dalorzo:
/m
修饰符只影响regex
^
$
元字符的行为。因为这两个修饰符都没有出现在这个问题的模式中,所以在OS X中,它不会对hanks perreal.产生任何影响Terminal this抛出了一个未终止的替换模式错误。我不知道为什么。我的Sed比我的Perl差。不过,感谢您花时间。感谢Borodin。我从手册页上看到-值0777将导致Perl将文件整个吞掉,因为该值没有法律字符-但是,我需要同时添加
-0777
(?s)
让它工作:
perl-w-0777-pi-e's/(?s)(Password\s*)\w*()/$1NEWPASSWORD$2/g'文件。html
注意到了您关于html解析器的建议。再次感谢。
(?s)
不应该有任何区别。它只会影响点的行为(
)元字符,您没有使用。@tech-otaku:不,我的答案是正确的。修改器
/s
没有区别,是不必要的。这同样适用于
/m
修改器,达洛佐认为是required@Borodin:这很奇怪,因为没有
(?s)
在OS X终端中找不到匹配项。想不出原因。@Borodin和@Alan我的道歉,你确实是对的。我不确定为什么我认为需要
(?s)
。它就像广告上说的那样工作。我想我的大脑有些僵硬了!
 sed -i '/<th>Password<\/th>/!b;n;s/<td>[^<]*/<td>NEWPASSWORD/' file.html