使用 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'
我已经尝试了很多在这里找到的解决方案,但我仍然无法在多行上进行 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'