2011-07-12 67 views
1

我目前使用下面的Perl一行代碼在子文件夾之間遞歸地匹配多行文件。它的工作原理除了強制您使用.來匹配\n。但我需要使用\n因爲.也將匹配任何字符。正則表達式多行匹配在子文件夾中(一行代碼)

有沒有辦法用Perl一個班輪做到這一點?如何與其他Linux程序一起使用?

perl -i -pe 'BEGIN{undef $/;} s/FIND/REPLACE/smg' $(find "/PATH-TO-DIRECTORY" -name "*.html" -type f) 

編輯:

正則表達式:\ thello世界....

正則表達式:\ thello世界\ n \ n \ n \ n

測試實例:


    hello world! 


    hello world! 
    foo 
+0

我沒跟着你。爲什麼你不得不使用'.'來匹配換行符? –

+0

您的編輯並未使您的問題更清楚。第二個正則表達式('\ thelloworld \ n \ n \ n \ n')匹配得很好。 –

+0

@Tim Pietzcker其實,你是對的。它可以使用\ n。 WTF?我必須使用不同的單線。隨意刪除這篇文章。 –

回答

1

我創建的目錄和文件的樹會導致以下情況:

$ cat $(find a -type f) 
EFabcd 
EFbacA 
QuuxQuuxr 
Foobar 
abcd 

然後,使用SED我想我得到了你所尋找的解決方案:

$ sed -n 'H;${x;s/d\nEF/FOO/;p;}' $(find a -type f) 

如何它工作嗎?首先,我們用-n來壓制sed的輸出。然後是命令。對於每一行,我們添加一個新行而行,以保持空間的內容:

H 

在文件的結尾,它帶來的保留空間的內容到模式空間(其中更換即可被製成):

x 

在此之後,我們將所有文件的所有內容視爲唯一行。現在,我們可以取代的圖案,它包括一個新行,以及,如:

s/d\nEF/FOO/ 

一旦施加的替換,我們打印結果:

p 

其結果是:

$ sed -n 'H;${x;s/d\nEF/FOO/g;p;}' $(find a -type f) 

EFabcFOObacA 
QuuxQuuxr 
Foobar 
abcd 

(注意在結果開始處有一條空行,我相信很容易修復)

就是這樣的東西你在找什麼?

+0

這一個班輪不會取代文件中的字符串;它輸出到stdin。是的,輸出以空行開始。 –

+0

@brandizzi:很好的答案。 – shellter