如何找到与模式匹配的结构
struct struct_name {
....
....
};
我正在使用
sed -n -e '/struct{/,/}/p'
如何搜索任何struct_name
答案 0 :(得分:0)
这将在文本文件中搜索 struct_name 。您可以使用-E开关来使用正则表达式。
grep -no struct_name test.txt
-n开关导致包含行号,-o表示只显示该行的匹配元素。
答案 1 :(得分:0)
提取所有 struct
定义(符合POSIX标准的命令):
sed -n '/struct [^ {]\{1,\} {/,/}/p' file
对于空白变化(符合POSIX)更加强大:
sed -n '/struct[[:blank:]]\{1,\}[^ {]\{1,\}[[:blank:]]*{/,/}/p' file
替代方案,使用扩展正则表达式(适用于GNU和BSD / macOS sed
):
sed -E -n '/struct[[:blank:]]+[^ {]+[[:blank:]]*\{/,/\}/p' file
awk
替代(仅awk
使用扩展的正则表达式):
awk '/struct[[:blank:]]+[^ {]+[[:blank:]]*\{/,/\}/' file
awk
解决方案的另一个优势是,如果一个结构定义全部位于单个行上,它也将被正确提取:awk
查找 相同输入行上的范围的结束作为范围的开头,而sed
则没有。
要按名称提取特定 struct
定义 :
sed
不支持变量,所以最好的选择是拼接 shell变量 shell扩展前 强>
name='struct_name' # define name to search for as shell var.
sed -n '/struct '"$name"' {/,/}/p' file # splice shell var. into sed script
请注意,我故意不使用sed -n "/struct $name {/,/}/p"
- 由shell 整体扩展的单个双引号字符串 - 所以至于清楚说明sed
脚本的哪一部分是由shell预先扩展的。
这适用于这种简单的情况,但通常是棘手的业务,因为您必须确保扩展的变量值不包含破坏命令的正则表达式/ sed
元字符。
这是 awk
替代,它使用awk
变量和文字子字符串匹配来绕过可能必须转义变量值的问题:
awk -v name='struct_name' 'index($0, "struct " name " {"),/}/' file
此解决方案还有一个额外的好处,即如果结构定义全部位于单个行上,也会正确提取结构定义:awk
查找结束 相同输入行上的范围作为范围的开头,而sed
则没有。