como combinar vários padrões e alterar uma parte com sed

3

Eu tenho as linhas abaixo em um arquivo:

SUT_INST_PIT=true
SUT_INST_TICS=true
SUT_INST_EXAMPLES=false
SUT_INST_PING=false

Como posso criar uma linha sed para corresponder ao padrão SUT_INST_EXAMPLES & SUT_INST_PING e defina false para true ?

Não posso simplesmente substituir false por true porque não quero alterar SUT_INST_PIT & SUT_INST_TICS mesmo se forem falsos !!!

Eu tenho no momento dois comandos sed que estão funcionando, mas eu gostaria apenas de uma linha!

sed -i "s/SUT_INST_EXAMPLES=false/SUT_INST_EXAMPLES=true/g" <file>
sed -i "s/SUT_INST_PING=false/SUT_INST_PING=true/g" <file>

Só mais uma coisa que a linha sed deve poder ser parametrizada para definir false - > true ou true - > false , mas apenas para SUT_INST_EXAMPLES & SUT_INST_PING .

Solução (de acordo com o @RomanPerekhrest) e como usá-lo no envio (esperar script):

send "sed -i 's\/^\(SUT_INST_EXAMPLES\|SUT_INST_PING\)=false\/\1=true\/' file\r"
    
por FotisK 09.05.2017 / 17:22

3 respostas

1

sed abordagem:

sed -i 's/^\(SUT_INST_EXAMPLES\|SUT_INST_PING\)=false/=true/' file

file contents:

SUT_INST_PIT=true
SUT_INST_TICS=true
SUT_INST_EXAMPLES=true
SUT_INST_PING=true

\(SUT_INST_EXAMPLES\|SUT_INST_PING\) - grupo alternativo, corresponde a SUT_INST_EXAMPLES OR SUT_INST_PING no início da cadeia

Alternativa gawk (abordagem GNU awk ):

gawk -i inplace -F'=' -v OFS='=' '$1~/^SUT_INST_(EXAMPLES|PING)/{$2=($2=="false")? "true":"false"}1' file
    
por 09.05.2017 / 17:25
2

Você pode simplesmente alternar com:

sed -i -E '/^SUT_INST_(PING|EXAMPLES)=/{s/false/true/;t;s/true/false/;}' infile

Isso alterará true para false ou false para true , dependendo do valor atual.

    
por 09.05.2017 / 17:40
0

sed permite que você faça várias operações em cada linha:

sed -e '...' -e '...' file

Assim, você pode pelo menos combinar suas duas invocações sed em uma com

sed -i -e 's/^SUT_INST_EXAMPLES=false/SUT_INST_EXAMPLES=true/' \
       -e 's/^SUT_INST_PING=false/SUT_INST_PING=true/' file

Para parametrizar a substituição, use variáveis:

examples="true"
ping="false"

sed -i -e "s/^SUT_INST_EXAMPLES=.*\$/SUT_INST_EXAMPLES=$examples/" \
       -e "s/^SUT_INST_PING=.*\$/SUT_INST_PING=$ping/" file

As opções acima definem incondicionalmente os valores de SUT_INST_EXAMPLES e SUT_INST_EXAMPLES para os valores de $examples e $ping , respectivamente.

    
por 09.05.2017 / 18:10

Tags