2012-09-26 45 views
2

我有一個文件開始,看起來像這樣:比賽,如果上一行與字符

expression1 
- expresson1.1 
- expressoion1.2 
expression2 
-expression2.1 
expression3 
-expression3.1 
-expression3.2 
-expression3.3 

我想要做的就是,刪除線1.2,3.2和3.3,所以只有不以開頭的行一個減號,並保留下一行。

所以我試着編寫一個正則表達式,匹配每一行以減號開始,前一個也以減號開始,然後刪除它們。

到目前爲止,沒有成功。任何提示將非常感激。

+1

你試圖實現這個reg表達式? – BugFinder

+1

一如既往,您嘗試了什麼,以及您使用的是什麼正則表達式風味? –

回答

1

如果一個awk的解決方案將被你接受,檢查下面的一行代碼:

awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}' yourFile 

測試

kent$ echo "expression1 
dquote> - expresson1.1 
dquote> - expressoion1.2 
dquote> expression2 
dquote> -expression2.1 
dquote> expression3 
dquote> -expression3.1 
dquote> -expression3.2 
dquote> -expression3.3 
dquote> "|awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}' 
expression1 
- expresson1.1 
expression2 
-expression2.1 
expression3 
-expression3.1 
+0

它的工作原理,謝謝! –

0

根據您的正則表達式的味道有可能是一個方法來激活多線模式。在這種情況下,除了整個字符串的開始和結束之外,^$匹配行的開始和結束。

/^-.*$\n((^-.*$\n?)+)/ 

這應該與至少兩個連續的行開始-。第一個捕獲/子模式包含第一個捕獲/子模式之後的所有行。所以這些比賽就是你想要刪除的內容。

當然,請將\n替換爲適合您系統的行。

1

你可以使用這個表達式:

/(-.+)\s((-.+)?(\s|))+/g 

與更換匹配:

$1\n 

你可以看到這個正則表達式在行動RegExr here

P.S.難以解決的問題,因爲你沒有固定長度的前綴來匹配,這裏lookarounds不起作用,而lookbehind(和lookahead)需要固定長度的字符串,如here(靠近頁面末尾)。