Como anexar texto para valor no par de valores-chave em um arquivo de texto que tenha muitos desses pares

5

Eu tenho um arquivo de texto keyvalue.txt com conteúdo:

one=abc
two=def
three=ghi
four=jkl
five=mno
six=pqr

Agora, quero anexar xyz ao valor de three que se tornará

three=ghixyz

O conteúdo do arquivo resultante deve ser:

one=abc
two=def
three=ghixyz
four=jkl
five=mno
six=pqr

Existe alguma maneira de fazer isso no script de shell?

    
por Jathavedas Avadhani 29.06.2018 / 10:18

3 respostas

9

Existem várias maneiras; por exemplo, com sed :

sed -i 's/^RELEASESTATUS=.*/&xyz/' keyvalue.txt

Isso procura as linhas que começam com RELEASESTATUS= , correspondem à linha completa (graças a .* ) e substituem essas linhas pelo conteúdo da linha ( & ) seguido por xyz .

    
por 29.06.2018 / 10:22
7

Semelhante a resposta de Stephen , mas ligeiramente diferente na forma como é executada:

sed -i '/^RELEASESTATUS=/s/$/xyz/' keyvalue.txt

Em vez de substituir a linha inteira por uma cópia de si mesmo com algum texto adicionado ao final, primeiro ele localiza a linha correta (a linha que tem RELEASESTATUS= no início) e, em seguida, substitui o texto necessário na fim dessa linha.

Isso usa o fato de que a forma geral do comando substituto ( s ) em sed é

start,end s/pattern/replacement/flags

onde start e end fornece o intervalo de linhas ao qual o comando deve ser aplicado, fornecido como um endereço inicial e final (e "endereço" pode ser um número de linha ou uma expressão regular ou um deslocamento). Ao usar um único endereço, o comando é aplicado apenas àquela linha (ou às linhas únicas correspondentes a uma expressão regular específica).

    
por 29.06.2018 / 10:43
1

Você também pode tentar com awk :

awk 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt

E se você tiver GNU awk 4.1.0 ou mais tarde, poderá fazer isso no local:

gawk -i inplace -v INPLACE_SUFFIX=.bak 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt
    
por 29.06.2018 / 10:54