sed 完全な文字列置換が機能しない

sed 完全な文字列置換が機能しない

さまざまなキーと値のペアを格納する2つのスクリプトins.shvariable.shvariables.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

関連情報