Busca Padrão entre linhas específicas e números de linha de impressão

2

Eu tenho um arquivo de 20 linhas. Eu quero procurar uma string entre as linhas 10 e 15 e imprimir a string junto com os números de linha do arquivo original.

Eu tentei sed -n 10,15p file | grep -n "pattern"

O problema com o comando acima é, o número da linha de saída 10 de sed será o número de linha 1 para grep .

Por isso, não está imprimindo os números de linha do arquivo original.

    
por Lokesh 11.01.2015 / 05:32

3 respostas

3

Ao trabalhar com sed , normalmente acho mais fácil restringir consistentemente meu possível resultado. É por isso que às vezes me apóio no operador de negação ! . Muitas vezes, é mais simples eliminar a contribuição desinteressante do que selecionar o tipo interessante - pelo menos, essa é a minha opinião sobre o assunto.

Acho esse método mais in-line com o comportamento padrão de sed - que é imprimir automaticamente o espaço padrão no final do script. Para coisas simples como essa, também pode resultar mais facilmente em um script robusto - um script que não depende das extensões de sintaxe de certas implementações para operar (como é comumente visto com sed {functions} ) .

É por isso que eu recomendei que você fizesse:

sed '10,15!d;/pattern/!d;=' <input

... que primeiro corta qualquer linha fora do intervalo de linhas 10 & 15, e dentre aqueles que permanecem, qualquer linha que não corresponda a pattern . Se você achar que prefere que o número da linha sed seja impresso na mesma linha da linha correspondente, provavelmente veria paste nesse caso. Talvez ...

sed '10,15!d;/pattern/!d;=' <input |
paste -sd:\n -

... que apenas substituirá a entrada \n ewlines por um caractere : ou outro \n ewline.

Por exemplo:

seq 150 |
sed '10,50!d;/5/!d;=' |
paste -sd:\n -

... imprime ...

15:15
25:25
35:35
45:45
50:50
    
por 11.01.2015 / 11:08
1

Aqui está uma solução awk :

awk '10<=NR && NR<=15 && /pattern/ {print NR,$0}' file

Se precisarmos usar somente sed , considere:

sed -n '10,15 {/pattern/ {=;p}}' file | sed 'N;s/\n/ /'

O comando = do sed irá imprimir apenas o número da linha em uma linha separada. A segunda instância de sed acima é usada para combinar cada duas linhas, de forma que o número da linha apareça logo antes de sua linha.

    
por 11.01.2015 / 06:31
1

Usando nl :

nl file | sed -n '10,15{/pattern/p
}'
    
por 11.01.2015 / 06:26

Tags