如何在sed中搜索任何名称匹配

时间:2016-10-25 00:01:45

标签: sed

如何找到与模式匹配的结构

struct struct_name {
....
....
};

我正在使用

sed -n -e '/struct{/,/}/p' 

如何搜索任何struct_name

2 个答案:

答案 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则没有。