如何从特定的char开始提取头行(忽略前导空格)?

时间:2017-10-31 20:42:16

标签: linux bash shell sed grep

我试图从matlab代码中提取注释行。

%% header comments
% description of function
% explanations of args
%... 

function out = myfunc(in)
...
% in-code comment
...
%%

我尝试了grep "^%" *.m,但它输出了所有注释行。

我只想在头脑中发表评论

%% header comments
% description of function
% explanations of args
%... 

所以,它应该在function out = myfunc(in)之前停止。前面的空格和空行被忽略了。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

要在function关键字之前提取所有评论,您可以使用sed进行两级过滤:

sed -n '1,/^function/{/^%/p}' file

对于所有行(从第一行)到function,只打印那些以注释字符%开头的行(跳过非注释和空行)。

详细。第一部分n,/regex/range address,起始地址在行1中,结束地址在第一行(1之后)以{{1开头字符串。

如果无法保证function,则可以使用function[[:alnum:]]。在GNU [[:alpha:]]上,可以使用单词字符的其他名称sed

第二部分\w仅针对先前选择(寻址)的行执行。 {/regex/ p}(打印)操作仅针对以p开头的行执行。

另请注意%标记:默认情况下,它会阻止-n打印每一行。仅使用明确的sed操作打印行。

示例:

p

结果:

$ cat file
%% header comments
% description of function
% explanations of args

% date: ...
% author: ...

function out = myfunc(in)
...
% in-code comment
...
%%

答案 1 :(得分:0)

您可以使用awk在看到评论时开始打印,并在第一个非评论行退出:

$ awk '/^%/{f=1} /^[^%]/{exit} f' file
%% header comments
% description of function
% explanations of args
%...