2011-05-27 31 views
3

使用GNU sed,我需要刪除包括括號在內的括號內的詞組,如(click here ....)click here後面的文字有所不同,但我需要刪除整個外部圓括號。sed或perl僅當第一個內部詞匹配時才刪除外部括號

我試過放在下面許多變化,但我似乎無法擊中右一個:

sed -e 's/\((click here.*[^)]*\)//' 

編輯愚蠢,我沒有注意到,其實有經常斷行的括號中間的字符串,所以sed可能不會起作用。例如:

(click here to 
enter some text) 

回答

2

用Perl你可以運行:

perl -00 -pe "s/\(click here [^)]*\)//g" inputfile > outputfile 

它將讀取inputfile中一個字符串,然後替換所有出現的(click here anychar but '('),然後在輸出文件中全部輸出。

+0

「-00」的作用是什麼?這工作! – 2011-05-27 17:57:13

+0

@Michael:它將記錄分隔符定義爲空,所以整個文件被讀入一個字符串中。 – Toto 2011-05-27 18:01:04

3

如果沒有嵌套的括號,也許你可以嘗試這樣的:

sed -e 's/(click here [^)]*)//' 
+0

這有立即刪除了'點擊here'和任何一個字下面,留下剩餘的詞和括號的結果。例如'(點擊這裏輸入文字)'變成'(輸入文字)' – 2011-05-27 16:57:21

+0

@Michael,可能不是。至少它在這裏工作。無論如何,我只是發現,你不需要逃離parens。我相應地編輯了答案。 – sidyll 2011-05-27 17:02:41

+0

@Michael:你能提供一個它不起作用的測試用例嗎?考慮:'回聲「這是一個測試(點擊這裏輸入文本)系統」|「 sed -e's /(點擊這裏[^]] *)//''請注意,如果在一行中可能出現多次點擊,最後一次可能會出現g。 – 2011-05-27 17:10:08

1

這裏的另一個sed做法,保持了完整的輸入在保持緩衝區:

# see http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/ 
echo ' 
() 
(do not delete this) 
() 
(click here to 
enter some text) 
() 
' | 
sed -n '1h;1!H;${;g;s/(\([^)]*\))/\1/g;p;}'