Shell 使用grep和sed过滤文本

Shell 使用grep和sed过滤文本,shell,sed,scripting,grep,Shell,Sed,Scripting,Grep,我有一个包含标题的文本文件,标题由16位数字和一个名称组成,还有几个被调用的函数: 00000001000006c0 <_name>: ... 100000730: e8 8b ff ff ff callq 1000006c0 <_func1> ... 10000070c: e8 7f 05 00 00 callq 100000c90 <_func2> ... 0000000100

我有一个包含标题的文本文件,标题由16位数字和一个名称组成,还有几个被调用的函数:

  00000001000006c0 <_name>:
  ...
  100000730:    e8 8b ff ff ff          callq  1000006c0 <_func1>
  ...
  10000070c:    e8 7f 05 00 00          callq  100000c90 <_func2>
  ...
  0000000100000740 <_otherName>:
  ...
  100000730:    e8 8b ff ff ff          callq  1000006c0 <_func3>
  ...
  10000070c:    e8 7f 05 00 00          callq  100000c90 <_func4>
  ...
我通过以下命令成功获取标题名称:

 grep -o '\w*>:$' | sed 's/_//' | sed 's/>://' | cat > headingNames.tmp

但我最终只得到了标题名。你能帮我推一下吗?

我会用awk+tr

<INPUT_FILE awk 'NF==2 {header=$2} NF>2 {print header, "--", $NF}' | tr -d '<_>:'

您需要跨行保持状态,因此仅使用sed和grep将非常棘手。另一方面,Awk非常适合这种情况。

我会用Awk+tr来完成

<INPUT_FILE awk 'NF==2 {header=$2} NF>2 {print header, "--", $NF}' | tr -d '<_>:'
您需要跨行保持状态,因此仅使用sed和grep将非常棘手。另一方面,Awk非常适合这种情况。

使用Awk:

awk '{p=$0;gsub(/[<>:]/, "")} p ~ /:$/ && NF==2{name=$2;next} NF>2{print name, "--", $NF} ' file
_name -- _func1
_name -- _func2
_otherName -- _func3
_otherName -- _func4
awk'{p=$0;gsub(/[:]/,“”)}p~/:$/&&NF==2{name=$2;next}NF>2{print name,“--”,“$NF}”文件
_名称--_func1
_名称--_func2
_其他名称--_func3
_其他名称--_func4
使用awk:

awk '{p=$0;gsub(/[<>:]/, "")} p ~ /:$/ && NF==2{name=$2;next} NF>2{print name, "--", $NF} ' file
_name -- _func1
_name -- _func2
_otherName -- _func3
_otherName -- _func4
awk'{p=$0;gsub(/[:]/,“”)}p~/:$/&&NF==2{name=$2;next}NF>2{print name,“--”,“$NF}”文件
_名称--_func1
_名称--_func2
_其他名称--_func3
_其他名称--_func4
我会使用Perl,但我确信您可以使用sed,而且您确实可以:

/^[0-9a-fA-F][0-9a-fA-F]* </{s/.*<_*\(.*\)>.*/\1/;h;d;}
/<.*>/{G;s/.*<_*\(.*\)>\n\(.*\)/\2 -- \1/p;}
d
/^[0-9a-fA-F][0-9a-fA-F]*我会使用Perl,但我确信您可以使用sed,而且您确实可以:

/^[0-9a-fA-F][0-9a-fA-F]* </{s/.*<_*\(.*\)>.*/\1/;h;d;}
/<.*>/{G;s/.*<_*\(.*\)>\n\(.*\)/\2 -- \1/p;}
d
/^[0-9a-fA-F][0-9a-fA-F]*这可能适合您(GNU-sed):

sed-nr'/^\s*\s{16}/{h;d};Gs/*/\2--\1/p文件
复制标题,将其附加到非标题行,然后在适用时提取标题和函数名。

这可能适用于您(GNU-sed):

sed-nr'/^\s*\s{16}/{h;d};Gs/*/\2--\1/p文件

复制标题,将其附加到非标题行,然后在适用的情况下提取标题和函数名。

谢谢,如果没有其他内容,这将起作用,然后将行放在顶部。但是我只想打印那些有“callq”标签的。我想这可能是灰色的,但这会破坏awk的功能。很简单,只需将命令中的“NF>2”更改为“NF>2&&$0~/callq/”。谢谢,如果没有其他选项,这将起作用。但是我只想打印那些有“callq”标签的。我想这可能是灰色的,但这会破坏awk的功能。很简单,只需将命令中的“NF>2”更改为“NF>2&&$0~/callq/”。谢谢,如果没有其他选项,这将起作用。但是我只想打印那些有“callq”标签的。我想那可能是灰色的,但那会破坏awk的功能。非常感谢你的帮助。谢谢,如果没有其他东西的话,这将起作用,然后排在顶部。但是我只想打印那些有“callq”标签的。我想这可能是灰色的,但这会破坏awk的功能。非常感谢您的帮助。我很喜欢Perl的方式-我已经尝试了一段时间,但我的正则表达式真的不符合要求!我认为博克新线评论是这样的,但这里说:#/bin/perl-w严格使用;使用警告;我的$current=“”;while(){if(/^[0-9a-f]{16}:/){$current=$1;next;}打印“$current--$1\n”if/*/;}我很想用Perl的方式-我已经尝试了一段时间,但我的正则表达式真的没有达到标准!我认为博克新线评论是这样的,但这里说:#/bin/perl-w严格使用;使用警告;我的$current=“”;while(){if(/^[0-9a-f]{16}:/){$current=$1;next;}如果/*/;}打印“$current--$1\n”
sed -nr '/^\s*\S{16}/{h;d};G;s/.*<_(.*)>.*<_(.*)>.*/\2 -- \1/p' file