Este código lhe dará a saída desejada
awk '/Line2/ {
print; getline; if ($0 == "LineEXTRA"){print;getline; sub(/3/,"NEW")}
}
{ print }' file
Precisamos alterar Line3
somente após dois contextos de linhas anteriores específicos.
Os contextos específicos são:
Line2
LineEXTRA
O arquivo contém
Line1
Line2
Line3
-----
Line1
Line2
LineEXTRA
Line3
-----
Line1
Line2
Line3
O arquivo precisa ter
Line1
Line2
Line3
-----
Line1
Line2
LineEXTRA
LineNEW
-----
Line1
Line2
Line3
Nossa tentativa
awk '/Line2/ {
print; getline; if ($0 ~ /Line3/) sub(/3/,"NEW")
}
{ print }' file
resultados
Line1
Line2
LineNEW
-----
Line1
Line2
LineEXTRA
Line3
-----
Line1
Line2
LineNEW
Não é isso que queremos.
Nossa outra tentativa não funciona de todo
awk '/Line2\nLineEXTRA/ {
print; getline; if ($0 ~ /Line3/) sub(/3/,"NEW")
}
{ print }' file
Este código lhe dará a saída desejada
awk '/Line2/ {
print; getline; if ($0 == "LineEXTRA"){print;getline; sub(/3/,"NEW")}
}
{ print }' file
@Dababi answer is perfect.
Outra variante do gnu-sed
sed -zr 's/(Line2\nLineEXTRA\nLine)3/NEW/g' ex
( sed -z
usa o arquivo inteiro, então temos acesso direto ao contexto de múltiplas linhas. Essa solução deve ser evitada para arquivos gigabytes)
Tags awk