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$
作为换行符锚定regexp\n
- 慢慢地从左到右构建regexp,在进行过程中检查每一部分
- 一旦有了工作版本,就用更具体的字符类替换单个空白/非空白
- 进一步将一个或多个类细化到特定范围或数字,例如1到3(
)或3(\{1,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