使用 perl 进行多行搜索

Multiline search with perl

我已经尝试了很多在这里找到的解决方案,但我仍然无法在多行上进行 Perl 搜索。

我有一个 index.htm 文件,里面有:

<!DOCTYPE html><html lang="en">
         
    
         
      
      <head>
        <meta charset="utf-8">
        <meta name="format-detection" content="telephone=no">  


    
    <script type="text/javascript" src="/company/rses/14rwer/contents/scripts/jquery.js"></script>
 

<h2 class="subhead">
<p>principal facts:</p>
....

所以我想删除以<!DOCTYPE>开头的所有内容,直到元素<h2 class="subhead"

我试过像这样使用 m 选项(m 不是“多行”吗?):

find . -type f -name "index.htm" | xargs perl -i -pe 's/<\!DOCTYPE html>.*?<h2 class="subhead//mg'

然后使用 s 选项...

但是我还是无法得到这个多行选择。

我可以获得这样的单行选择: find . -type f -name "index.htm" | xargs perl -i -pe 's/<\!DOCTYPE html>//mg' 但这不是我想要的,因为我想搜索并替换所有这些行。

/m 修饰符改变了 ^$ 在正则表达式中的行为(在多行下,它们匹配每行的 start/end), /s 改变 . 的行为方式(通常,. 不匹配换行符,但在 /s 下匹配)。

但是 perl -p 逐行读取输入,因此代码永远不会将整个输入作为单个字符串执行。使用 -0777 将整个文件作为单个字符串读取:

perl -0777  -pe 's/<\!DOCTYPE html>.*?<h2 class="subhead">//sg'