Estou tentando imprimir a linha correspondente e a quarta linha da linha correspondente (linha que contém a expressão que estou procurando).
Eu tenho usado o seguinte código:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Mas isso apenas imprime a linha correspondente.
Isso imprime apenas a quarta linha.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Preciso imprimir apenas a linha correspondente e a quarta linha.
shell-script
debal
fonte
fonte
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
faz exatamente o que você quer, a menos que eu estou mal-entendido que você</td>
que não é a linha 4Respostas:
No awk, você faria da seguinte maneira
ou
Explicação
A primeira solução encontra todas as linhas correspondentes
pattern
. Quando encontra uma correspondência, armazena o número do registro (NR
) na matriznr
. Ele também armazena o quarto registroNR
na mesma matriz. Isso é feito pelonr[NR+4]
. Cada registro (NR
) é verificado para ver se está presente nanr
matriz; nesse caso, o registro é impresso.A segunda solução funciona essencialmente da mesma maneira, exceto quando encontra a
pattern
linha impressa e, em seguida, armazena o quarto registro à frente na matriznr
e depois passa para o próximo registro. Então, quandoawk
encontrar esse 4º registro, oNR in nr
bloco será executado e imprimirá esse registro +4 depois.Exemplo
Aqui está um exemplo de arquivo de dados
sample.txt
.Usando a 1ª solução:
Usando a segunda solução:
fonte
awk
atalhos aqui. Você pode adicionar uma breve explicação (coisas como impressão estão implícitas no awk e que matrizes são associativas etc.)?Estou simplesmente adicionando uma exclusão das linhas apropriadas antes da impressão
{ 3,5d ; p }
.fonte
sed: -e expression #1, char 18: unknown option to
s'`Você pode tentar a
-A
opção comgrep
, que especifica quantas linhas após a linha correspondente devem ser impressas. Junte issosed
e você obterá as linhas necessárias.grep -A 4 pattern input.txt | sed -e '2,4d'
Usando
sed
, excluímos da segunda linha até a quarta.fonte
pattern
no arquivo.Aqui está uma maneira no Perl que pode lidar com um número arbitrário de linhas correspondentes:
Em Perl. a variável especial
$.
é o número da linha atual. Assim, cada vez que encontro uma linha correspondentepattern
, imprimo-a e salvo o número da linha como$c
. Em seguida, imprimo novamente quando o número da linha atual é 4 a mais do que o impresso anteriormente.fonte
Você está essencialmente fazendo uma busca e substituição. Você pode adicionar apenas uma descoberta ao mesmo comando e ele imprimirá os dois :)
fonte