当行以某个单词开头时,用于从文件中删除行的脚本

时间:2017-06-27 22:50:40

标签: bash awk sed dot

我有一个像下面这样的点文件。

....
29 [label="OutRet", fillcolor="#90EE90", shape=box];
30 [label="In(alloced_return_alloca[bits 0 to ..])", fillcolor="#6495ED",
      shape=box];

subgraph cluster_Call4 { label="Call4 : f = (int *)alloca(sizeof(*f) * __lengthof_f);";
                           fillcolor="#B38B4D"; style="filled"; 17;16;
     };

edge [dir=back];
7 -> 6 [color="#000000", style="dotted"];
....

每当有子图属性时,我想删除该属性。在某些文件中可能有多个sugraph属性,在这种情况下我想删除所有这些属性。我尝试使用sed '/subgraph/ d' inputfile > outputFilesed -i 's/subgraph.*//'文件outputFile但它只删除包含子图的行并给出如下结果:

30 [label="In(alloced_return_alloca[bits 0 to ..])", fillcolor="#6495ED",
      shape=box];

                           fillcolor="#B38B4D"; style="filled"; 17;16;
     };

  edge [dir=back];

有没有办法我可以删除其他两条线(通常有多少相关线),即从子图开始直到" edge"出现的线。另外,有没有办法可以将结果输出到同一个文件中,而不是将其写入另一个文件中?

由于

2 个答案:

答案 0 :(得分:1)

我发现sed '/subgraph/,/edge/d' inputFile这是有效的。

答案 1 :(得分:1)

要删除由某些模式分隔的一系列行,您应该使用address range(两个地址用逗号,分隔)和regexp addresses来选择之间的行(包括第一个和最后一个),然后是delete命令:

sed '/subgraph/,/edge/d' -i file

使用-i / --in-place标记修改file到位(使用optional backup)。

顺便说一句,通过反转逻辑(使用!)并打印出所有内容,除了该范围内的行外,获得了相同的结果:

sed -n '/subgraph/,/edge/!p' -i file

注意我们使用-n来禁止自动打印模式空间,而是使用p命令显式打印它,每行匹配。