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

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

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

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

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

решение1

Другой perlпуть:

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

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

решение2

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

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

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

решение3

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

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

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

решение4

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.
Третья принимает аргументы командной строки как имена файлов, считывает файлы построчно и заменяет строку.

Связанный контент