Regex 为什么';这句话不管用吗?

Regex 为什么';这句话不管用吗?,regex,sed,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' stru

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

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-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};
这可能适用于您(GNU-sed):

  • 首先,只使用空格(
    \s
    )、非空格(
    \s
    )和文本(
    =
    {
    }
    )构建一个松散的regexp
  • 确定上述内容是否为1个或多个、零个或多个或零个或一个,例如,一个或多个空白将由
    \s\+
    表示,零个或多个非空白将为
    \s*
    ,零个或一个分组将为
    \(\s\+\s\+\)\?
  • 尝试使用
    ^
    作为字符串的开头,
    $
    作为字符串的结尾,并使用多行regexp
    \n
    作为换行符锚定regexp
  • 慢慢地从左到右构建regexp,在进行过程中检查每一部分
  • 一旦有了工作版本,就用更具体的字符类替换单个空白/非空白
  • 进一步将一个或多个类细化到特定范围或数字,例如1到3(
    \{1,3\}
    )或3(
    \{3\}
    )当然,不需要限定单个类、文字或组

没有,我试过了。我发誓什么都不管用。我已经尝试了很多东西。不是所有版本的sed都能将
+
识别为特殊字符。不要使用
[*0-9A-Za-z\+
,而是使用
[*0-9A-Za-z\[*0-9A-Za-z\]*
哇,我不知道我做错了什么,但你所有的解决方案都可以。我想我只是个哑巴。非常感谢你们的帮助,我真的很感激。
sed '/^\S\+\s\+=\s\+(\s*\S\+\(\s\+\S\+\)\?\s*){\s*\S\+\s*,\s*\S\+\s*};/!d' file