Как объединить несколько условных команд sed в bash?

Вы можете указать rpmbuild, где используются ваши файлы --define '_builddir <Your_Root>'Вам не нужно запускать его с другой учетной записью, хотя я думаю, что это хорошая практика. Надеюсь, это полезно. Эран.

1
30.09.2021, 00:55
2 ответа

Я был бы склонен создать массив из sedкоманд, используя параметр -e, чтобы сообщить sedчто это все команды, (а не одна команда и несколько имен файлов ). Кроме того, переменная не раскрывается в одинарных -кавычках, поэтому вместо этого используйте двойные -кавычки. (Примечание. :Я предполагаю, что двойные -кавычки в строках замены должны были исправить это, но это не так. Если на самом деле в файл нужно добавить двойные кавычки -, используйте вместо них \".)

Вот так:

sedCommands=()
if [[ -n "$var1" ]]; then   
    sedCommands+=(-e "s/^;*\max_execution_time =.*/max_execution_time = ${var1}/")
fi
    
if [[ -n "$var2" ]]; then   
    sedCommands+=(-e "s/^;*\memory_limit =.*/memory_limit = ${var2}/")
fi

if [[ -n "$var3" ]]; then   
    sedCommands+=(-e "s/^;*\max_file_size =.*/max_file_size = ${var3}/")
fi
    
if [[ -n "$var4" ]]; then   
    sedCommands+=(-e "s/^;*\max_post_size =.*/max_post_size = ${var4}/")
fi

if [[ ${#sedCommands[@]} -gt 0 ]]; then
    sed -i "${sedCommands[@]}" /user/php8.0-fpm/php.ini
else
    echo "No changes made." >&2
fi
2
30.09.2021, 01:36

Вы уже согласились с другим ответом, но если ваша первоначальная идея заключалась в том, чтобы одна sedкоманда выполняла фильтрацию (без необходимости условий оболочки ), вы могли бы использовать простой прием, например:

sed -i "/^${var1}/!s/^;*\(max_execution_time = \).*/\1${var1}/
        /^${var2}/!s/^;*\(memory_limit = \).*/\1${var2}/
        /^${var3}/!s/^;*\(max_file_size = \).*/\1${var3}/
        /^${var4}/!s/^;*\(max_post_size = \).*/\1${var4}/" /user/php8.0-fpm/php.ini

Как видите, я добавил инвертированный адрес к каждой sзамещающей команде. /^${var1}/будет соответствовать, только если var1пусто (или состоит из меньшего или равного количества точек с запятой, чем )в строке. !инвертирует совпадение, поэтому команда sвыполняется только в том случае, если varсодержит значение.

3
30.09.2021, 06:52

Теги

Похожие вопросы