Заменить строку многострочным содержимым файла

Мне нужно заменить строку SALT в файле с содержимым другого файла. Проблема в том, что во входном файле есть несколько строк. Я попробовал что-то подобное в моем скрипте bash:

SALT=`cat salt.txt`;
sed "s/SALT/$SALT/" wp-config.php > result.txt

Это нормально работает, когда salt.txt состоит из одной строки, но если строк больше, это не удастся. Я читал, что это может сделать PERL. Но я не знаю как. Не могли бы вы помочь мне?

4 ответа

Решение

Другая perl путь:

perl -pe 's/SALT/`cat salt.txt`/e' wp-config.php > result.txt

Ключ здесь /e опция регулярного выражения, позволяющая нам использовать perl результат команды в виде строки подстановки.

Если вы хотите придерживаться bashвыберите символ, который не появляется ни в вашей строке, ни в вашем файле, скажем, @; затем:

SALT=`< salt.txt tr '\n' '@'`
sed "s/SALT/$SALT/" wp-config.php | tr '@' '\n' > result.txt

Таким образом, перед заменой newline символы в вашей строке изменяются на @ и после замены @ символы изменяются обратно на newlines, чтобы SALT больше не обрабатывается как массив, а просто как переменная, содержащая длинную строку.

Вы можете сделать это:

sed -e "/SALT/{r salt.txt" -e "d}" wp-config.php  > result.txt

куда salt.txt это соль, wp-config.php это входной файл и SALT это строка для замены

perl -e 'open my $S, "<", "salt.txt" or die $!;
         $salt = do { local $/ ; <$S> };
         s/SALT/$salt/, print while <>;
        ' wp-config.php > result.txt

Первая строка открывает salt.txt,
Вторая строка читает его содержимое в переменную $salt.
Третий принимает аргументы командной строки в качестве имен файлов, читает файлы построчно и заменяет строку.

Другие вопросы по тегам