sed 전체 문자열 교체가 작동하지 않습니다

sed 전체 문자열 교체가 작동하지 않습니다

다양한 키 값 쌍을 저장하는 두 개의 스크립트 ins.shvariable.sh.variables.sh

ins.sh

#!/usr/bin/env bash

set -e # Exit upon error

# This script generates a 64-bit system
source variables.sh

# Parse options
while getopts ":t:" opt; do
    case $opt in
        t )
            if [ $OPTARG = TRUE ] || [ $OPTARG = FALSE ]; then
                sed -i "s/*.MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh
            else
                echo "Invalid argument. -t only takes either 'TRUE' or 'FALSE'."
                exit 1
            fi
            ;;

        \? )
            echo "Invalid option: -$OPTARG" >&2
            ;;

        : )
            echo "Option -$OPTARG requires an argument."
            ;;
    esac
done

변수.sh

MAKE_TESTS=TRUE
MAKE_PARALLEL=-j4
INSTALL_DIR=/tmp/install-dir

이 값을 변경하려면 다음 명령을 실행하십시오.

bash ins.sh -t FALSE

명령을 다음으로 변경해야 MAKE_TESTS=FALSE하지만 전혀 발생하지 않습니다.

TRUE값을 에서 으로 FALSE또는 그 반대로 전환하고 싶습니다 . 이를 달성하기 위해 전체 문자열을 바꾸고 사용자가 제공한 값을 전달했습니다.

고쳐 쓰다

지금은 일을 끝낼 수 있는 방법을 찾았습니다. 먼저 전체 문자열을 삭제한 다음 새 문자열을 추가합니다.

sed -i "/MAKE_TESTS/d" variables.sh
echo "MAKE_TESTS=${OPTARG}" >> variables.sh

하지만 문자열 교체가 작동하지 않는 이유가 여전히 궁금합니다.

답변1

바꾸다:

 sed -i "s/*.MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh

그리고:

 sed -i "s/.*MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh

.*0개 이상의 임의 문자를 나타냅니다. 대조적으로, 의 의미는 *.sed 구현마다 다를 수 있습니다. GNU sed에서는 *문자 그대로 별표 뒤에 문자가 오는 것을 의미합니다. 관찰하다:

$ echo 'aa' | sed 's/*./HI/'
aa
$ echo '*a' | sed 's/*./HI/'
HI

관련 정보