Awk: Altere as linhas dependendo da próxima

1

Como posso usar o awk para modificar linhas que correspondam a um determinado padrão, mas somente se a linha NEXT não corresponder a outro padrão?

Por exemplo, pegue este fragmento:

....
pattern1 100 200 300
pattern1 300 400 400
pattern2 300 900 700
pattern1 200 500 900
...

Eu gostaria de modificar todas as linhas contendo pattern1 , exceto a segunda, que é seguida por uma linha contendo pattern2 .

Isso é semelhante a esta questão , mas apenas o contrário.

    
por Grodriguez 11.01.2017 / 12:55

3 respostas

0

Isso faz o que eu precisava:

/pattern1/ {
    if (candidate) {
        print "modify:", candidate
    }
    candidate=$0
    next
}

/pattern2/ {
    if (candidate) {
        print candidate
        candidate=0
    }
}

{
    if (candidate) {
        print "modify:", candidate
        candidate=0
    }
    print $0
}
    
por 13.03.2017 / 17:35
1

tente algo como

/pattern2/ { print intact ; print $0 ; next ;}
! /pattern2/  { print new ;}
{ intact=$0 ; $1="p1" ; new=$0 ; }

há uma linha extra vazia

o resultado é

p1 100 200 300
pattern1 300 400 400
pattern2 300 900 700
p1 300 400 400
    
por 11.01.2017 / 16:51
0
sed -e '
   /pattern1/!b
   $q; N
   /\npattern2/!s/^/MODIFIED:/
   P;D
' yourfile

perl -0777pe 's/(?=pattern1.*$)(?!pattern2)/MODIFIED:/gm' yourfile
    
por 13.03.2017 / 18:11