2012-09-27 149 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

相关问题