2012-09-27 83 views
0

我在課堂上過去幾天一直在使用正則表達式。我無法確定爲什麼這個表達式不起作用。我在找像下面的表達式:爲什麼sed語句不起作用?

value = (struct node){ 5, NULL}; 
value2 = (structname){ 1, 2 }; 
*pointer = (bla){3,4}; 

這裏是我使用的表達:

sed -n '/^[*0-9A-Za-z_]+ *= *(*[0-9A-Za-z_]+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]};/p'  structfile 

我缺少什麼,因爲它沒有返回值。另外,我還在一些表達式中使用了[^,],並且我仍然用s來表示線條。我錯過了什麼?

+0

哇,我不知道我做錯了什麼,但所有高雅的你的解決方案工作我想我只是愚蠢的。非常感謝你的幫助,我真的很感激。 – UniqueUsername

回答

1

您需要轉義+;並將{[0-9A-Za-z, ]}修復爲{[0-9A-Za-z, ]*}

sed -n '/^[*0-9A-Za-z_]\+ *= *(*[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile 


[email protected]:~$ cat structfile 
value = (struct node){ 5, NULL}; 
value2 = (structname){ 1, 2 }; 
*pointer = (bla){3,4}; 
not astruct 
notastructstr = 

[email protected]:~$ sed -n '/^[*0-9A-Za-z_]\+ *= *(*[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile 
value = (struct node){ 5, NULL}; 
value2 = (structname){ 1, 2 }; 
*pointer = (bla){3,4}; 
+0

沒有嘗試過。我發誓什麼都行不通。我嘗試瞭如此多的東西。 – UniqueUsername

+1

@ReallyBadAtStuff,但它適用於我的機器...?有兩個'+'來逃避。 – Marcus

+1

並非所有sed版本都將'+ +識別爲特殊字符。 * [* 0-9A-Za-z _] [* 0-9A-Za-z _] *'代替' –

1

這可能會爲你工作(GNU SED):

sed '/^\S\+\s\+=\s\+(\s*\S\+\(\s\+\S\+\)\?\s*){\s*\S\+\s*,\s*\S\+\s*};/!d' file 
  • 開始只使用空格(\s),非空白(\S)和文字(=建立一個鬆散的正則表達式, (,), {,};
  • 確定以上是否是1或更多,ze或多或零或一例如一個或更多的空白將由\s\+表示零或更多的非空白。將\S*和零或一分組將是\(\s\+\S\+\)\?
  • 試用和使用^字符串的開始錨定正則表達式,$端字符串和多行正則表達式\n作爲換行符
  • 構建正則表達式慢,從左到右,檢查每一塊當你沿着
  • 去一旦你有一個工作版本的更具體的字符類取代個體空白/非空白
  • 進一步細化一個或多個類到特定範圍或編號e。 G。一到三(\{1,3\})或3(\{3\})當然一個類,文字或組不需要資格

HTH

相關問題