Bashで複数の条件付きsedコマンドを結合する方法は?

Bashで複数の条件付きsedコマンドを結合する方法は?

4つの変数を生成するbashダイアログボックスがあります。各個別変数 -空でない場合- sedコマンドが同じファイルで実行されるようにします。

var1、var2、var3、およびvar4変数の4つのBashダイアログ・スクリプトの生成

#!/usr/bin/env bash   
response=$(dialog               \
        --title "ini configure"     \
        --form  "Configure php.ini" \
          15 50 0                   \
        "Execution Time:"       1 1    "$exe_time"     1 10 20 0      \
        "Memory Limit:"         2 1    "$mem_limit"    2 10 20 0      \
        "Max File Size:"        3 1    "$max_file"     3 10 20 0      \
        "Max Post Size:"        4 1    "$max_post"     4 10 20 0      \  
        3>&1 1>&2 2>&3 3>&-)
    
    responsearray=($response)
    
    var1=${responsearray[0]} 
    var2=${responsearray[1]} 
    var3=${responsearray[2]} 
    var4=${responsearray[3]}

これら4つの条件付きsedコマンドを結合する方法は?

if [[ -n "$var1" ]]; then   
    sed -i 's/^;*\max_execution_time = .*/max_execution_time = "${var1}"/' /user/php8.0-fpm/php.ini
    
if [[ -n "$var2" ]]; then   
    sed -i 's/^;*\memory_limit = .*/memory_limit = "${var2}"/' /user/php8.0-fpm/php.ini 

if [[ -n "$var3" ]]; then   
    sed -i 's/^;*\max_file_size = .*/max_file_size = "${var3}"/' /user/php8.0-fpm/php.ini
    
if [[ -n "$var4" ]]; then   
    sed -i 's/^;*\max_post_size = .*/max_post_size = "${var4}"/' /user/php8.0-fpm/php.ini

複数のsedコマンドをセミコロンと組み合わせることができることを知っていますが、問題を引き起こすのは条件です。

オペレーティングシステム:Ubuntu 20.04ヘッドレス

ベストアンサー1

他の回答を受け入れましたが、元のアイデアが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反転します。!svar

おすすめ記事