好的,基本上我正在尝试使用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
及其身体)
答案 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