我如何使用GNU-utils来过滤这样的文本?

时间:2014-04-29 23:54:41

标签: linux bash shell awk sed

好的,基本上我正在尝试使用GNU_Utils来过滤单个代码文件中的文本。

代码是这样的:

 // space line
 <fun1>    // no space
   ins1;    // two space before 
   ins2;
   ins3;

 <fun2>   // no space
   ins4;
   ins5;
 ....

 <fun3>
 .....

目前我有一个黑名单功能,应该在上面的文字中过滤掉。

blacklist : func2

所以我的问题是:

如何使用GNU-Utils中的工具处理上述文本并过滤掉&#34;黑名单中的功能&#34; ..? (在上面的例子中,我应该删除func2及其身体)

3 个答案:

答案 0 :(得分:5)

删除fun2

awk '/^fun2/ {a=0;next} /^[a-z]/ {a=1} a'

假设我们有一个输入文件infile,它看起来像:

$ cat infile

fun1
  ins1;
  ins2;
  ins3;

fun2
  ins4;
  ins5;

fun3
  ins6;

然后,使用上面的内容:

$ awk '/^fun2/ {a=0;next} /^[a-z]/ {a=1} a' infile
fun1
  ins1;
  ins2;
  ins3;

fun3
  ins6;

如何运作

我们要删除以fun2开头的块。因此,每当遇到以fun2开头的行时,标志a将设置为零,并且不会打印该行。在标志设置为1之前不会打印更多行,每当遇到以fun2以外的任何内容开头的块时都会发生这种情况。

答案 1 :(得分:1)

当您处理数据组时,最好将其视为一个组。

awk '!/^fun2/' RS="" ORS="\n\n" file
fun1
  ins1;
  ins2;
  ins3;

fun3
  ins6;

将记录选择器设置为空为每个组而不是一行创建一条记录 然后进行测试并告诉您不喜欢以fun开头的记录 将输出记录选择器设置为两个新行保留记录之间的空行。


如果论坛之间没有空白行,您可以gnu awk使用fun作为分隔符:
(它也会保留空行)

awk '!/^2/' RS="fun" ORS="fun" file
fun1
  ins1;
  ins2;
  ins3;

fun3
  ins6;

这也应该有用,但最好使用引号。

awk '!/^2/' RS=fun ORS=fun file

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '/^fun/h;G;/fun2/!P;d' file

每个新函数标头都存储在保留空间中。将函数标题附加到每一行,如果出现所需的标题,则不打印它。

现在将blacklist转换为上面的sed脚本:

# blacklist file (blfile) contains function headers separated by a space

sed 's/^blacklist : //;s/ /\\|/g;s|.*|/^fun/h;G;/&/!P;d|' blfile | sed -f - file