awk - muda depois do contexto multilinha

3

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
    
por nina 02.01.2017 / 11:27

2 respostas

4

Este código lhe dará a saída desejada

awk '/Line2/ { 
   print; getline; if ($0 == "LineEXTRA"){print;getline; sub(/3/,"NEW")}
}
{ print }' file
    
por 02.01.2017 / 11:49
2

@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)

    
por 02.01.2017 / 12:17

Tags