Bash에서 여러 조건부 sed 명령을 결합하는 방법은 무엇입니까?

Bash에서 여러 조건부 sed 명령을 결합하는 방법은 무엇입니까?

네 개의 변수를 생성하는 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]}

이 네 가지 조건부 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

답변2

나는 옵션을 사용하여 명령 이 모두 명령임을 알려주는 sed명령 세트를 만드는 경향이 있습니다 (하나의 명령과 일부 파일 이름이 아님). 또한 변수는 작은따옴표로 확장되지 않으므로 큰따옴표를 사용하십시오. (참고: 문자열에서 큰따옴표를 바꾸면 이 문제가 해결될 것이라고 생각했지만 그렇지 않습니다. 실제로 파일에 큰따옴표를 추가해야 하는 경우 대신 이를 사용하십시오.)-esed\"

그래서 이렇게 :

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

관련 정보