2011-04-23 24 views
1

,我有以下的代碼是在幾個文件中重複:搜索和替換正則表達式在多個文件(大數據)

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

可能會有一些空白前/後TR,TH或TD標籤。

我會爲了使用什麼工具和正則表達式用下面的來代替它:

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

感謝。

+0

不使用正則表達式查找/替換/解析HTML或XML。 – blueberryfields 2014-10-06 15:29:21

+0

@blueberryfields - 這是一個值得關注的問題,我在下面評論過。然而,在這個特殊情況下,我會說使用正則表達式是可以接受的,因爲我基本上想要一個快速的方法來對大量文件進行三個簡單的搜索/替換操作。這種情況沒有涉及嵌套。 – 2014-10-18 12:32:19

+0

也許會在你的問題中添加一個註釋(即「我知道這通常是一個壞主意,但我確定這是一個可接受的例外」)?對於開發人員來說,這是一個非常常見的陷阱,導致如此高的浪費時間,值得額外努力來防止其他人陷入其中 – blueberryfields 2014-10-19 17:26:42

回答

3

Perl有一個-0777命令行選項可讓您將整件事物讀入內存。一旦你這樣做了,你可以使用一個用空格替換\s*,它將跨越換行符邊界。如果使用.,請確保在替換結束時使用/s

我真的不能告訴你想匹配的東西,但總的原則是:

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

對於∞ 時,不要使用正則表達式來解析HTML。使用HTML解析器。

在Perl中,這意味着使用一個模塊,如Web::Scraper

+0

我有一個特殊的安排。 :) – tchrist 2011-04-23 20:20:54

+0

這是一次性的事情,所以我一直在尋找可能的最短解決方案。否則,我不會用正則表達式來完成它:) – 2011-04-23 20:26:52

1

你也可以做到這一點將awk以及。首先將記錄分隔符設置爲</tr>,然後找到開始標記<tr>以及搜索字符串。假設您的搜索字符串是「更多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 
相關問題