sed substituição de string inteira não funciona

3

Eu tenho dois scripts ins.sh e variable.sh . variables.sh contém vários pares de valores-chave.

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

variables.sh

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

Para alterar o valor, execute o seguinte comando:

bash ins.sh -t FALSE

Este comando deve mudar para o MAKE_TESTS=FALSE , mas isso não acontece de todo.

Eu só quero mudar os valores de TRUE para FALSE e vice-versa. Para conseguir isso, eu estava substituindo toda a string e passando o valor fornecido pelo usuário.

UPDATE

Por enquanto, encontrei uma maneira de realizar minha tarefa. Primeiro, estou excluindo toda a string e adicionando a nova string.

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

Mas ainda gostaria de saber por que minha substituição de string não está funcionando.

    
por Abhimanyu Saharan 30.05.2016 / 04:54

1 resposta

2

Substituir:

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

com:

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

.* significa zero ou mais de qualquer caractere. Por outro lado, o significado de *. provavelmente varia de uma implementação do sed para outra. No GNU sed, isso significa uma estrela literal, * , seguida por qualquer caractere. Observe:

$ echo 'aa' | sed 's/*./HI/'
aa
$ echo '*a' | sed 's/*./HI/'
HI
    
por 30.05.2016 / 05:37