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