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

.*表示零个或多个任意字符。相比之下, 的含义*.可能因 sed 的一种实现而异。在 GNU sed 中,它表示字面上的星号 ,*后跟任何一个字符。观察:

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

相关内容