Я хотел бы заменить одну строку в файле на другую, чтобы быть более конкретным, заменить имя пользователя: пароль в файле dovecot passwd (/etc/dovecot/passwd
), но только если запись существует.Поиск и замена Sed в файле, только если существует шаблон
Итак, что мне нужно:
sed
команда- что не делает ничего, если запись не существует (см голубятни PASSWD пример)
- , который заменяет в файле (если есть не очень хорошо причина outputing в новый файл и перемещение нового файла в оригинале)
Вот /etc/dovecot/passd
пример:
[email protected]:{CRAM-MD5}479375185777b7ba573747c111483bdd628332a70268ce283dc80bedd0f65988
[email protected]:{CRAM-MD5}10b7176649d8bb3eb38f6b68a0c6c826ffab5656181821e598296ebd31e8f64f
и то, что я пытался до сих пор (создает новый файл, выход на новый и mv
к первоначальному даже если запись не существует)
#!/usr/bin/env php
<?php
$passwd_file = '/etc/dovecot/passwd';
$time = time();
$newtempfile = '/tmp/' . $time . 'dvctpwd';
/**
* $search generates replace target [email protected]:{CRAM-MD5}479375185777b7ba573747c111483bdd628332a70268ce283dc80bedd0f65988
* if [email protected] gives correct password to dovecot's doveadm pw -u [email protected] -poldpassword
**/
$search = $argv[1] .':' . exec("doveadm pw -u " . $argv[1] . " -p" . $argv[2]);
/**
* $replace generates replace value [email protected]:{CRAM-MD5}...
* i.e. scheme with new password
**/
$replace = $argv[1] .':' . exec("doveadm pw -u " . $argv[1] . " -p" . $argv[3]);
$command = <<<DD
sed -e "s|$search|$replace|" $passwd_file > $newtempfile && mv $newtempfile $passwd_file && echo "Password changed!\n";
DD;
$output = passthru($command);
echo $output . PHP_EOL;
См: [как заменить определенную строку в текстовом файле с использованием php?] (http://stackoverflow.com/q/3004041/3776858) – Cyrus
Одна из причин избежать поддержки «in-file» sed заключается в том, что он не является in-file; sed имитирует поведение в файле с использованием временного файла, поэтому единственным преимуществом является упрощенный код, в то время как вы увеличиваете риск проблем, если файловая система заполняется или, возможно, с другими условиями. Мне нравится писать скрипты с обработкой ошибок почти по каждой команде, так что если что-то не удается, я могу предпринять соответствующие действия в скрипте. – ghoti
@ghoti хорошо пункт. Я подозревал, что фактическая замена не выполняется в самом файле, но в любом случае я получаю решение так просто, как может быть, так как я не владею языком BASH. –