我在课堂上过去几天一直在使用正则表达式。我无法确定为什么这个表达式不起作用。我正在寻找以下表达式:
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 :(得分: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
)和文字(=
,(
,)
构建一个松散的正则表达式,{
,}
和;
)\s\+
表示,零个或多个非空格将为\S*
,零个或一个分组将为\(\s\+\S\+\)\?
^
尝试并使用$
锚定正则表达式,以开始字符串,\n
结束字符串,并使用多行正则表达式\{1,3\}
进行换行\{3\}
)或3({{1}})当然单个班级,文字或小组不需要合格HTH