Usando o Unix, ao detectar um padrão, precisamos detectar seu outro padrão correspondente

1

Ao detectar a linha que contém o padrão night , precisamos detectar sua linha correspondente contendo o outro padrão === que está ocorrendo apenas em uma linha superior, conforme mostrado abaixo.

  • Conteúdo do arquivo:

=== test1.log
boo
bar
game
=== file23.txt
night78
far
night
text
=== log3.c
aaa
limit
night3

  • Saída:

    === file23.txt
    night78
    night
    === log3.c
    night3

  •   
por ekassis 08.05.2015 / 15:41

2 respostas

2

Você pode fazer isso com o awk com algo assim:

 awk '/===/ {SEC=$0;PRINTED=0} /night/ {if(!PRINTED) print SEC; print $0; PRINTED=1;}' <file>

, que irá procurar a linha === e armazená-la, e observe que ela ainda não imprimiu essa. Então se encontrar o padrão night verificará se já imprimiu o cabeçalho da seção ou não, imprima se não, então imprima a linha atual e marque que já imprimiu o cabeçalho da seção.

    
por 08.05.2015 / 15:46
0

Tentei isso com o sed

sed -n '/===/{
h
d
}
/night/{
G
s/\(.*\)\n\(.*\)/\
/p
}' inputFile

Isso não é exatamente o que você queria, mas bastante semelhante.

=== file23.txt
night78
=== file23.txt
night
=== log3.c
night3
  • /== mantém o padrão atual no buffer
  • /night corresponde a todas as linhas que contêm token night
  • G anexa o buffer atual ao espaço padrão atual.
  • /s troca a posição da string de patten atual e da string de buffer atual.
por 09.05.2015 / 20:17

Tags