2015-06-01 57 views
0

我在一個目錄中有幾個文件,其中我在兩個分隔符之間有一段文本。替換終端中所有文件中的多行字符串

Text to keep 

//###==### 
Text to remove 
//###==### 

Text to keep 

廣泛的搜索後,我發現下面的Mac OS X的終端命令,與我可以刪除分隔自己。

perl -pi -w -e 's|//###==###||g' `find . -type f` 

不過,我需要一個正則表達式,它不僅能去除分離自己的東西,但也什麼之間在不在。就像這樣,雖然這條線沒有任何作用。

perl -pi -w -e 's|//###==###(.*)//###==###||g' `find . -type f` 

編輯時,重複標誌

我看到類似的東西here使用標範圍操作,但我不能讓它爲我工作。失敗的嘗試包括:

perl -pi -w -e 's|//###==###..//###==###||g' `find . -type f` 
perl -pi -w -e 's|//###==###(..)//###==###||g' `find . -type f` 
perl -pi -w -e 's|//###==###[..]//###==###||g' `find . -type f` 

SOLUTION

下面耶的幫助,下面oneliner將不正是我想要的:

$ perl -0777 -p -i -e 's/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms' `find . -type f -name "index.php"` 
+0

http://stackoverflow.com/a/2147588/223226 –

+0

你是不是收到此錯誤:'文件名,目錄名稱或卷標語法不正確。 – serenesat

+2

'perl -ne'print unless m | // ### == ### | ... m | // ### == ### |'' – RobEarl

回答

1

您可以使用:

s/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms 

Working Demo

然後在終端和Perl中。鑑於:

$ echo "$tgt" 
Text to keep 

//###==### 
Text to remove 
//###==### 

Text to keep 

使用-0777命令標誌啜整個文件,然後:

$ echo "$tgt" | perl -0777 -ple 's/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms' 
Text to keep 
Text to keep 

或者,您可以使用範圍運算符。如果做這樣一來,你不能刪除開頭和結尾的空行,如果這是你的意圖:

$ echo "$tgt" | perl -lne 'print unless (/\/\/###==###/ ... /\/\/###==###/)' 
Text to keep 


Text to keep 
+0

謝謝! :-)與-0777選項似乎工作正常。有沒有辦法在所有文件上執行此操作,並將文件保存爲相同的操作? – physicalattraction

+0

這似乎適用於此(字體看起來很奇怪,因爲撇號衝突的意思):$ perl -0777 -p -i -e's /(^ \ s *^\/\/### ==# ##。*?\/\/### == ### \ s *)// gms''find。 -type f -name「index.php」' – physicalattraction

相關問題