为什么这个sed语句不起作用?

时间:2012-09-27 03:03:00

标签: regex 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得到行。我错过了什么?

2 个答案:

答案 0 :(得分: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


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

me@localhost:~$ 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};

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/^\S\+\s\+=\s\+(\s*\S\+\(\s\+\S\+\)\?\s*){\s*\S\+\s*,\s*\S\+\s*};/!d' file
  • 首先只使用空格(\s),非空格(\S)和文字(=()构建一个松散的正则表达式,{};
  • 确定上述是否是1或更多,零或多或零或一,例如一个或多个空格将由\s\+表示,零个或多个非空格将为\S*,零个或一个分组将为\(\s\+\S\+\)\?
  • 使用^尝试并使用$锚定正则表达式,以开始字符串,\n结束字符串,并使用多行正则表达式\{1,3\}进行换行
  • 慢慢地,从左到右构建正则表达式,随着时间的推移检查每个部分
  • 一旦你有一个工作版本,用更具体的字符类替换单个空格/非空格
  • 进一步将一个或多个类细化为特定范围或数字,例如一对三(\{3\})或3({{1}})当然单个班级,文字或小组不需要合格

HTH