Você pode usar sed
para criar um script sed
do arquivo1 e, em seguida, executar sed
com esse script para transformar o arquivo2 na saída esperada:
sed 's!^!s/!;s! = !/!;s!$!/!' file1 | sed -f- file2
A primeira saída de sed
é
s/This is a string/mystringrocks/
s/This is another string/mystringrocksmore/
Que claramente executa as substituições que você precisa.
Você também pode usar o perl, ele funcionará mesmo para strings que contenham barras e pontos de exclamação:
perl -wE 'while (<>) {
chomp;
($from, $to) = split / = /;
$h{$from} = $to;
last if eof;
}
$regex = join "|", map quotemeta, keys %h;
s/($regex)/$h{$1}/, print while <>
' file1 file2
Ele lê o primeiro arquivo, divide cada linha em =
e armazena o par $from => $to
em um hash. Em seguida, ele cria uma regex de todas as chaves (ou seja, de) e passa sobre o segundo arquivo e substitui as correspondências pelos valores armazenados no hash. Também costuma-se classificar as chaves por comprimento para usar a sequência mais longa, se houver dois padrões que iniciem no mesmo local:
map quotemeta, sort { length $b <=> length $a } keys %h;