0

在过去的几天里,我一直在课堂上使用正则表达式。我无法确定为什么这个表达式不起作用。我正在寻找如下表达式:

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 的行。我错过了什么?

4

2 回答 2

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};
于 2012-09-27T03:20:59.477 回答
1

这可能对您有用(GNU sed):

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

高温高压

于 2012-09-27T05:57:58.617 回答