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