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