如何在搜索字符串最后一次出现后在行上插入文本?

时间:2013-05-29 14:34:38

标签: replace insert find

我一直试图在这个问题上绞尽脑汁。

我正在尝试编写一个脚本,该脚本将在一组源* .cpp文件中的现有包含文件的最后一次出现后插入额外的包含文件和注释。源文件位于一组递归目录中,所以我想我的scrupt必须以find开头。

例如,之前:

#include <a>
#include <b>
#include <c>
// source code...

后:

#include <a>
#include <b>
#include <c>
// This is the extra include file
#include <d>
// source code...

3 个答案:

答案 0 :(得分:1)

你的问题很模糊。所以我会打破你需要做的事情。

  1. 查找包含结尾的位置(正则表达式,手写功能)。
  2. 将原始文本拆分为两部分。
  3. head + your include + tail = new text。
  4. 将新文本写入临时文件。
  5. 删除旧文件。
  6. 将临时文件重命名为旧文件名。
  7. 你可以使用C ++,而boost(以及c ++ 11)拥有你需要的所有抽象。

答案 1 :(得分:0)

你可以在python中做到这一点,我在下面做了一个示例脚本:

import os

def find_last_include(file_name):
    """ Returns last line with an include statement at the start """
    last_include_line = 0
    with open(file_name, "r") as f:
        for i,line in enumerate(f):
            if line.strip().startswith("#include"):
                last_include_line = max(i, last_include_line)
    return last_include_line



def insert_line(file_name, last_include_line_no, new_line):
    """ New line should end with \n"""
    try:
        with open(file_name,"r+") as f:
            print "Opening: {0}".format(file_name)
            # File is all the lines in the file as a list
            file = f.readlines()
            # last include line is the line we are going to replace the last inculde
            # with the last include + the new line we want
            last_include_line = file[last_include_line_no] + new_line
            file[last_include_line_no] = last_include_line
            print "Inserting: '{0}' On line: {1}".format(new_line.strip(), last_include_line_no)
            f.seek(0)  # Seek back to the start of the file
            for line in file:
                f.write(line)  # Write the lines with changes to the file
    except IOError as e:
        print e
    return None


if __name__ == '__main__':
    c_files = find_all(".c","Y:\\Python Stuff")
    line =  "#include <c>\n"
    for c_file in c_files:
        insert_line(c_file, find_last_include(c_file), line)
    print "Finished Inserting lines"

打印:

SEARCHING FOR FILES..
FOUND FILE: Y:\Python Stuff\prog.c
Finished finding
Opening: Y:\Python Stuff\prog.c
Inserting: #include <c> On line: 34
Finished Inserting lines

这样做是从给定文件夹开始查找所有“.c”文件,然后找到最后一个包含的行,并将该行添加到该行并重写该文件。奇迹般有效。不过,任何改进意见都会受到赞赏。

答案 2 :(得分:0)

我相信你现在已经发现这个问题的难点在于“在最后一次出现之后”。这让我想起了我的爷爷,她在同一个城镇生活了87年,偶尔会给出一些指示,比如“我们只是在主要街道上最后一个加油站的一个街区”。除非你知道Main St.足够知道最后一站是76号,你最终可能会在下一个城镇想知道是否还有另一个加油站。

那么解决方案是什么?从理论上讲,包含的最后一次出现可能是文件的最后一行。因此,您需要首先通过并将整个文件读入内存,以跟踪最后包含行的位置。然后花第二遍写出每一行,直到你达到最后一次出现,写下你的额外包括,然后是其余的行。

我相信,有一种方法可以在流媒体庄园中实现这一点,但它们仍需要两次通过您的数据。另一方面,这显然是一个源代码文件,这意味着它相当小,很容易适合内存。

但是,了解一些典型的源代码模式后,您可以通过查找第一次出现 not include ...的行并插入新的include来逃脱就在它之前。