2017-03-07 91 views
0

我有一個簡單sed的,我使用,以取代之間的一切(包括)//thistest.com----thistest.com什麼(刪除塊一起)命令:爲什麼我的sed多行查找和替換不能按預期工作?

sudo sed -i "[email protected]//thistest\.com--.*--thistest\[email protected]@g" my.file 

my.file內容是:

//thistest.com-- 
zone "awebsite.com" { 
     type master; 
     file "some.stuff.com.hosts"; 
     }; 

//--thistest.com 

由於我使用@作爲我的分隔符正則表達式,我不需要逃避/字符。我也正確(我認爲)在.com轉義.。所以我不確定究竟是什麼失敗。

爲什麼不是整個塊被替換?

+1

Sed一次操作一行。你無法以這種方式匹配多行模式。 –

回答

4

你有兩個問題:

  1. 桑達沒有做多模式匹配,至少,不是這樣你期待它。但是,您可以使用多行地址作爲替代。
  2. 根據您的sed版本,您可能需要轉義替代分隔符,尤其是如果您不僅僅將它們用作替代表達式的一部分。

因此,下面將在這兩個GNU和BSD的開發你的貼語料庫工作:

sed '\@^//thistest\[email protected], \@^//--thistest\[email protected] d' /tmp/corpus 

注意,在這個版本中,我們告訴sed來匹配之間的所有線路(含)兩個圖案。每個地址模式的開始分隔符都已正確轉義。該命令也被更改爲d刪除而不是s對於替換,並添加了一些空白以提高可讀性。

我也選擇將地址模式錨定到每行的開頭。您可能會或可能不會對這個特定的語料庫有幫助,但在可能的情況下這樣做通常是明智的,並且似乎不會傷害您的用例。

+0

我將添加的唯一的事情是,我將變量用於雙引號,以便「thistestsite.com」可以是變量等等。thx用於多行解釋 - 我正在閱讀的手冊「 sed'從未提及過「單行」! – Zak

0
# separation by line with 1 s// 
sed -n -e 'H;${x;s#^\(.\)\(.*\)\1//thistest.com--.*\1//--thistest.com#\2#;p}' YourFile 

# separation by line with address pattern 
sed -e '\#//thistest.com--#,\#//--thistest.com# d' YourFile 

# separation only by char (could be CR, CR/LF, ";" or "oneline") with s// 
sed -n -e '1h;1!H;${x;s#//thistest.com--.*\1//--thistest.com##;p}' YourFile 

注:

  • 假設只有1節這項測試每個文件的使用S的(如果不是,它的第一開口,直到最後收盤節之間刪除任何東西)//
  • 不適合大文件(將整個文件加載到內存中)用s //
  • sed使用地址模式不能選擇同一行上的段,它搜索第一個模式開始,然後下一行停止但非常EF對大文件和/或多部分不熟練