com awk
:
awk 'prev ~ /^Name=(Tom|Anything)$/ && /^Value=/ {$0 = "Value=123"}
{print; prev = $0}'
Ou com o nome e o novo valor armazenado em uma variável:
export NAME=Tom VALUE=123
awk 'prev == "Name=" ENVIRON["NAME"] && /^Value=/ {
$0 = "Value=" ENVIRON["VALUE"]
}
{print; prev = $0}'
Com sed
, o equivalente seria algo como:
sed -e 'x;/^Name=Tom$/{g;/^Value/s/=.*/=123/;h;b' -e '}' -e g
Embora, como sempre, seja mais curto, mas significativamente menos legível do que com awk
. Além disso, para trabalhar com valores arbitrários armazenados em variáveis, sed
não tem o equivalente de awk
' ENVIRON
', ou a capacidade de fazer uma comparação simples de strings (em oposição à correspondência de regex), precisa pré-processar os valores das variáveis primeiro, a menos que você possa garantir que as variáveis não contenham caracteres especiais para sed
.
sed -e "x;/^Name=$NAME\$/{g;/^Value/s/=.*/=$VALUE/;h;b" -e '}' -e g
Seria uma vulnerabilidade de injeção de comando (pelo menos com GNU sed
) se $NAME
e $VALUE
não fossem rigidamente controlados.