Eu fui em frente e criei um pequeno utilitário para você em C ++, espero que seja útil para você. Simplesmente compile e aproveite.
#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;
}
Compilado com:
g++ -o replacer replacer.cpp
Uso da amostra:
input.txt:
1
2
3
4
5
search.txt
3
replace.txt
Three
Comando
./replacer -i input.txt -s search.txt -r replace.txt -o output.txt
output.txt
1
2
Three
4
5
Se você tiver outras dúvidas, pergunte. Eu espero que ele realize o que você queria que ele fizesse. (Ele também aceita stdin e outputs para stdout se você omitir -i e -o) É claro que novas linhas, aspas, etc. não causarão nenhum problema, porque elas estão em arquivos separados.