grep uma linha antes do jogo mais a partida

7
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

na linha acima, o que eu quero é grep / sed / awk (qualquer método é bom) linha que tem & sinal mais uma linha em cima deles. Assim, por exemplo, a saída desejada será semelhante a:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

seguinte é o que eu tentei sem sorte.

egrep "&" | -b 1 file.txt
    
por Rana Khan 05.11.2013 / 22:42

2 respostas

14

Você pode fazer:

grep -B 1 '&$' your_file

Isso procurará linhas que terminem em & , remova $ para corresponder linhas com & em qualquer lugar.

A opção -B informa grep às linhas de "contexto" de saída que vêm antes das linhas correspondentes. Neste caso, desde que você quer uma linha de contexto, você precisa de -B 1 .

Esta opção está disponível no GNU grep , mas não está no padrão POSIX.

Aqui está uma simples solução sed que deve ajudar no caso de você não ter o GNU grep :

sed -n '/&/!N;/&/p' your_file

Como funciona

  • A opção -n suprime a ação padrão "print" de sed
  • /&/!N significa: se a linha atual não contiver & , acrescente a próxima linha ao espaço padrão.
  • /&/p significa: corresponde & e imprime o espaço do padrão.
por 05.11.2013 / 22:44
2

Veja como emular grep -B1 com sed :

sed '$!N;/pattern/P;D' infile

É muito parecido com o um aqui . Assim como o outro, ele lê a linha N ext, mas desta vez, P rints até o primeiro \n ewline se o espaço padrão corresponde e, assim como o outro, D elimina até primeiro \n ewline e reinicia o ciclo. Então, com sua entrada de amostra:

sed '$!N;/&/P;D' infile

saídas:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Novamente, para ver como funciona, adicione l antes e depois do N para ver o espaço padrão:

sed 'l;$!N;l;/&/P;D' infile

por exemplo. com um arquivo de amostra:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

estes são os comandos que sed executa e a saída correspondente:

cmd        output            cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
    
por 22.08.2015 / 23:04