我有这个配置文件,我想通过编程来编辑它。我以前总是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
不需要反斜杠。