【问题标题】:Perl command line to replace text block across multi-line using regexPerl命令行使用正则表达式跨多行替换文本块
【发布时间】:2016-09-27 13:41:26
【问题描述】:

我有一堆 html 文件需要替换以下文本:

<div id="header">
plus all info between
<!-- end #header -->

<?php include ("header.php"); ?>

我以为我可以运行这样的东西,但它与文本不匹配:

perl -p -i.bak -e 's/<div id="header">.*<!\-\- end #header \-\->/<\?php include \("header\.php"\); \?>/g' *.html

perl -p -i.bak -e 's/<div id="header">[\S\s\n]*<!\-\- end \#header \-\->/<\?php include \("header\.php"\); \?>/img' *.html

我不知道它是否没有跨多行搜索,我需要一个参数,或者我没有正确转义字符。任何帮助将不胜感激。

我想在一个目录中批量运行它,并在适当的地方更改每个文件中的所有内容。

编辑:寻找单个命令行版本,如果可能,不要使用多个 pl 文件。

【问题讨论】:

  • 不是重复的,但这解释了为什么它不起作用(-p 选项是罪魁祸首?)但我不明白示例中搜索和替换代码的结构应该是什么.如果我们可以拥有上述示例的实际工作副本,将会很有帮助。
  • 是否有可能替代 -p 命令以将文件作为一行读取? SnR 代码将如何集成?理想情况下,我认为这可以编码为单个命令行,而无需创建单独的 perl 文件?

标签: regex perl


【解决方案1】:

您可以使用-0 选项设置记录分隔符。像这样:

perl -0pe 's/.../.../g' *.html

这会将记录分隔符设置为NUL 字符,以便一次读取整个文件,而不是逐行读取。

【讨论】:

  • 这应该可以,但是有一天会出现一个包含合法 NUL 字符的文件,并且您的命令会中断。最好使用perl -0777 -pe ' ... ',它将$/ 设置为undef
猜你喜欢
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多