【问题标题】:sed/awk: Insert some text in a file after the last pattern foundsed/awk:在找到最后一个模式之后在文件中插入一些文本
【发布时间】:2014-03-13 22:31:02
【问题描述】:

我要插入文字

#include < abc/malloc.h>

毕竟在一个C文件中

#include

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

【问题讨论】:

  • 您真的希望这是最后一个#include 还是尖括号中的最后一个? (假设 #include 与角括号和引号的混合实现)?

标签: unix sed awk


【解决方案1】:

使用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

【讨论】:

  • 谢谢!它工作正常,但如何在文件中永久进行此更改?我看到 code.c 没有被修改。
  • @Ashish awk 不会修改原始文件。您应该将标准输出重定向到一个新文件,然后重命名它以覆盖原始文件
【解决方案2】:

输入:

$ 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 */

【讨论】:

  • 如果我想在 #include 的末尾添加一个换行符 \n 怎么办?知道怎么做吗?我正在使用 FreeBSD Unix。我尝试了类似的方法,但没有成功:sed "$la#include \n" 。在 STDOUT 上,它以换行符显示,但是当我将 STDOUT 数据保存到文件时,它变成了单行。
  • 假设 in.h 包含:#include #include #define MIN 100 那么在这种情况下输出如下:#include # include #include #define MIN 100(baz.h和#define打印在同一行)
  • cmets 中的代码难以阅读。如果您有其他信息,请编辑您的问题。
  • 我会使用$(grep '^#include' in.h | wc -l) 而不是$(grep -n '^#include' in.h | tail -1 | cut -d: -f1)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你可以试试这个,

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

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多