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.