Вы можете использовать sed
для создания сценария sed
из file1, а затем запустить sed
с этим сценарием, чтобы превратить file2 в ожидаемый результат:
sed 's!^!s/!;s! = !/!;s!$!/!' file1 | sed -f- file2
first sed
выводит
s/This is a string/mystringrocks/
s/This is another string/mystringrocksmore/
, который явно выполняет необходимые вам замены.
Вы также можете использовать perl, он будет работать даже для строк, содержащих косые черты и восклицательные знаки:
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
Он читает первый файл, разбивает каждую строку на =
и сохраняет пару $ из => $ до
в хэше. Затем он создает регулярное выражение из всех ключей (то есть из), перебирает второй файл и заменяет совпадения значениями, хранящимися в хэше. Также обычно ключи сортируют по длине, чтобы использовать более длинную строку, если есть два шаблона, которые начинаются в одном месте:
map quotemeta, sort { length $b <=> length $a } keys %h;