如何以编程方式将文件中的一行替换为多行?

如何以编程方式将文件中的一行替换为多行?

我有这个配置文件,我想通过编程来编辑它。我以前总是sed做一些小的改动,但现在我需要用多行替换一行,如下所示:

some code
# maintenance placeholder
more code

改成这个

some code
maintenance line 1
maintenance line 2
maintenance line 2
more code

我怎样才能做到这一点?

答案1

我继续用 C++ 为你创建了一个小实用程序,希望它对你有用。只需编译它即可使用。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc,char *argv[])
{
    fstream i,
                    s,
                    r,
                    o;
    string s_str,
                 r_str,
                 buf;
    int n;
    char ch,
             s_in = 1,
             s_out = 1;

    for(int n = 1; n < argc; n += 2)
    {
        if(argv[n][0] == '-')
        {
            switch(argv[n][1])
            {
                case 'i':
                    i.open(argv[n+1], fstream::in);
                    s_in = 0;
                    break;
                case 's':
                    s.open(argv[n+1], fstream::in);
                    break;
                case 'r':
                    r.open(argv[n+1], fstream::in);
                    break;
                case 'o':
                    o.open(argv[n+1], fstream::out);
                    s_out = 0;
                    break;
                default:
                    cerr << "Usage: helper [-i input_file] <-s search_file> <-r replace_file> [-o output_file]";
                    return 0;
            }
        }
    }
    if(!s_in && !i.is_open())
    {
        cerr << "Input could not be opened.";
        return -1;
    }
    if(!s.is_open())
    {
        cerr << "Search could not be opened.";
        return -1;  
    }
    if(!r.is_open())
    {
        cerr << "Replace could not be opened.";
        return -1;
    }
    if(!s_out && !o.is_open())
    {
        cerr << "Output could not be opened.";
        return -1;
    }

    /* get s and r in memory */
    while((ch = s.get()) != EOF)
        s_str += ch;
    s.close();
    while((ch = r.get()) != EOF)
        r_str += ch;
    r.close();

    buf = "";
    while((s_in ? (ch = cin.get()) : (ch = i.get())) != EOF)
    {
        buf += ch;
        for(n = 0; n < buf.length(); n++)
            if(buf.at(n) != s_str.at(n))
            {
                s_out ? (cout << buf) : (o << buf);
                buf = "";
                break;
            }
        if(n == s_str.length())
        {
            s_out ? (cout << r_str) : (o << r_str);
            buf = "";
        }
    }
    s_out ? (cout << buf) : (o << buf);

    if(!s_in)
        i.close();
    if(!s_out)
        o.close();

    return 0;
}

编译自:

g++ -o replacer replacer.cpp

示例用法:

输入.txt:

1
2
3
4
5

搜索.txt

3

替换.txt

Three

命令

./replacer -i input.txt -s search.txt -r replace.txt -o output.txt

输出.txt

1
2
Three
4
5

如果您有任何其他问题,请提出。我希望它能完成您想要它做的事情。(它还接受 stdin,如果您省略 -i 和 -o,它会输出到 stdout)当然,换行符、引号等不会造成任何问题,因为它们位于单独的文件中。

答案2

如果您有 perl,请尝试使用:

perl -pi.bak -e 's/oldtext/newtext/' 文件.txt

这将用“newtext”替换 file.txt 中的“oldtext”,并创建名为 file.txt.bak 的文件备份

答案3

如果@u8sand的回答(评论)对你来说不够清楚,你可以按照你描述的方式去做

sed'/#维护占位符/c\
维修线1\
维修线2\

你可以在s命令:

sed 的/超级用户/超级\
用户/'

也许,正如 u8sand 所建议的那样,有些版本sed不需要反斜杠。

相关内容