sed / awk:在找到最后一个模式后在文件中插入一些文本

时间:2014-03-13 13:56:01

标签: unix sed awk

我想插入文字

#include < abc/malloc.h>
在所有

之后的文件中
#include

行,就在最后一次出现#include之后。

4 个答案:

答案 0 :(得分:2)

使用awk

awk '
    FNR==NR && /^#include/ { line=NR; next }
    FNR!=NR
    FNR==line { print "#include <abc/malloc.h>" }
' code.c code.c

如你所见:

  • awk两次阅读code.c
  • 第一次FNR==NR

答案 1 :(得分:1)

输入:

$ cat in.h
#include <foo.h>
#include <bar.h>

/* No more includes */

/* But more stuff */

找到最后一个#include行:

$ l=$(grep -n '^#include' in.h | tail -1 | cut -d: -f1)

在此行后面添加一行:

$ sed "$l a#include <baz.h>" < in.h 
#include <foo.h>
#include <bar.h>
#include <baz.h>

/* No more includes */

/* But more stuff */

答案 2 :(得分:1)

假设你可以在包含之间有任何东西。

awk '
    BEGIN {
        x = 0
    }
    {
        if ($0 ~ /^#include/)
            x = NR
        b[NR]=$0
    }
    END {
        for (i = 1; i <= x; ++i)
            print b[i]
        print "#include <abc/malloc.h>"
        for (i = ++x; i <= NR; ++i)
            print b[i]
    }
' file.c

答案 3 :(得分:0)

你可以试试这个,

tac yourfile.c | sed '/#include/{ s/#include.*/#include<someheader>\n&/; :loop;n; t loop;}'| tac > updated_yourfile.c