___ qstnhdr___ sed função para substituir qualquer entrada de arquivo de configuração ______ qstntxt ___

Estou tentando escrever um script de construção para o SLES / RHEL que modifica os arquivos de configuração para estar em conformidade com os padrões da nossa empresa. Algumas configurações são formatadas como configuração = valor e algumas são apenas valores de configuração. Estou usando sed atualmente e sinto que estou quase lá, mas não está funcionando quando não há sinal de igual.

Código atual: (Desculpe, não sou muito bom em formatá-los corretamente ainda ...)

%pre%

Função atual (teste):

%pre%

No entanto, recebo isso como resultado:

%pre%

Funciona se eu tirar a última porção sed, mas somente onde houver um sinal de igual.

Alguma idéia do que estou fazendo errado?

    
______ azszpr364501 ___

Você pode simplificar o conjunto de substituições "semelhantes" sed para o seguinte:

%pre%

Uso :

%pre%

A saída:

%pre%     
______ azszpr364503 ___
%pre%

É suficiente seguir a variável por espaço ou sinal de igual, então uma substituição serve para todos.

Ao usar a opção %code% e o %code% após a substituição, você não precisa do %code% . O %code% já usou a linha certa.

    
___

1

Estou tentando escrever um script de construção para o SLES / RHEL que modifica os arquivos de configuração para estar em conformidade com os padrões da nossa empresa. Algumas configurações são formatadas como configuração = valor e algumas são apenas valores de configuração. Estou usando sed atualmente e sinto que estou quase lá, mas não está funcionando quando não há sinal de igual.

Código atual: (Desculpe, não sou muito bom em formatá-los corretamente ainda ...)

$ cat test.conf
setting1 value1 
setting2= value2
setting3 = value3
setting4 =value4 

Função atual (teste):

#!/bin/bash
replace () {  
file=$1  
var=$2  
new_value=$3



sed -e "s/^$var=.*/$var = $new_value/" -e "s/^$var =.*/$var = $new_value/" -e "s/^$var.*/$var = $new_value/" -e "s/^$var /$var $new_value/" "$file"|grep $var  

}


replace test.conf setting1 value1new 
replace test.conf setting2 value2new  
replace test.conf setting3 value3new  
replace test.conf setting4 value4new

No entanto, recebo isso como resultado:

$ ./functiontest
setting1 value1new= value1new 
setting2 value2new= value2new 
setting3 value3new= value3new 
setting4 value4new= value4new

Funciona se eu tirar a última porção sed, mas somente onde houver um sinal de igual.

Alguma idéia do que estou fazendo errado?

    
por Keith 11.05.2017 / 21:54

2 respostas

0

Você pode simplificar o conjunto de substituições "semelhantes" sed para o seguinte:

cat replace.sh 
#!/bin/bash
replace () {
var=$2  
new_val=$3

sed -e "s/^$var *= *.*/$var = $new_val/; s/^$var [^=]*$/$var $new_val/" "$1" | grep $var 

}

replace test.conf setting1 value1new 
replace test.conf setting2 value2new  
replace test.conf setting3 value3new  
replace test.conf setting4 value4new

Uso :

bash replace.sh

A saída:

setting1 value1new
setting2 = value2new
setting3 = value3new
setting4 = value4new
    
por 11.05.2017 / 22:29
0
sed -n "s/^$var[ =].*/$var = $new_value/p" "$file"

É suficiente seguir a variável por espaço ou sinal de igual, então uma substituição serve para todos.

Ao usar a opção -n e o p após a substituição, você não precisa do grep . O sed já usou a linha certa.

    
por 11.05.2017 / 22:33