【问题标题】:Search and replace regex over multiple files (large data)在多个文件(大数据)上搜索和替换正则表达式
【发布时间】:2011-08-11 14:51:02
【问题描述】:

我有以下在多个文件中重复的代码:

<tr>
    <th scope="row"> (some php code) </th>
    <td>
         (more php and html)
    </td>
</tr>

在 tr、th 或 td 标签之前/之后可能会有一些空格。

我应该使用什么工具和正则表达式来替换它:

<div class="row">
    $1
    $2
</div>

谢谢。

【问题讨论】:

  • 不要使用正则表达式来搜索/替换/解析html或xml。
  • @blueberryfields - 这是一个有效的问题,我在下面对此发表了评论。但是,在这种特殊情况下,我会说使用正则表达式是可以接受的,因为我本质上想要一种快速的方法来对大量文件执行三个简单的搜索/替换操作。本例中不涉及嵌套。
  • 可能会在您的问题中添加一个注释来说明这种效果(即,“我知道这通常是一个坏主意,但我确定这种使用是可以接受的例外”)?对于开发人员来说,这是一个非常常见的陷阱,会导致大量时间浪费,值得付出额外的努力来防止其他人陷入其中

标签: ruby regex linux perl sed


【解决方案1】:

对于 ∞th 时间,不要使用正则表达式来解析 HTML。使用 HTML 解析器。

在 perl 中,这意味着使用诸如 Web::Scraper 之类的模块。

【讨论】:

  • 我有一个特殊的分配。 :)
  • 这是一次性的,所以我一直在寻找最短的解决方案。否则我不会用正则表达式来做到这一点:)
【解决方案2】:

Perl 有一个 -0777 命令行选项,可以让您将整个内容读入内存。完成此操作后,您可以使用\s* 替换空格,它将跨越换行符边界。如果您使用.,请确保在替换结束时使用/s

我说不出来你想匹配什么,但一般原则是:

perl -0777 -i.orig -pe 's/foo/bar/gs' file1 file2 file3

【讨论】:

    【解决方案3】:

    awk 也可以这样做。首先将记录分隔符设置为&lt;/tr&gt;,然后找到开始标签&lt;tr&gt;以及搜索字符串。假设您的搜索字符串是“更多 html 代码”。

    v="my new string"
    awk -vRS="</tr>" -v newstring="$v" '/<tr>/ && /more html code/{ $0=newstring}{print $0>FILENAME}' file 
    

    Perl 的另一种替代方法,类似于您接受的答案

    ruby -0777 -i.orig -pe 's/foo/bar/gs' file1 file2 file3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2010-11-25
      相关资源
      最近更新 更多