Como posso grep uma região de uma string?

4

Eu tenho um arquivo que contém mais de 4000 caracteres e quero que a string entre a posição 148 e 1824. Como posso fazer isso?

    
por Thanakrit Wongsatit 04.01.2018 / 15:38

3 respostas

10

Você não usa grep. Existe uma ferramenta que foi projetada precisamente para esse tipo de coisa: cut . Para obter os personagens de 148 a 1824, faça:

cut -c 148-1824 file

O sinalizador -c significa caracteres selecionados. Use -b se você quiser trabalhar em bytes.

Se você insistir em usar grep , você teria que fazer algo assim (assumindo o grep grep)

grep -Po '^.{147}\K.{1675}' file

Corresponde os primeiros 147 caracteres ( ^.{147} ) e descarta-os ( \K ). Em seguida, corresponde aos próximos 1675 caracteres. O -o sinalizador diz grep para imprimir apenas a seção correspondente de uma linha e o sinal -P ativa expressões regulares compatíveis com perl que nos permitem usar \K .

    
por 04.01.2018 / 15:42
3

O comando abaixo fará o mesmo. Eu testei e funciona bem. Ele extrai todos os caracteres da posição 148 para a 1824.

awk '{print substr($0,148,1676)}' filename

substr($0,148,1676)} terá uma substring da linha atual ( $0 ), iniciando no 148º caractere e continuando até o caractere na posição 148 + 1676. Isso significa que ele termina na posição 1824.

    
por 04.01.2018 / 16:26
1

Para "grep" em uma subseção de cada linha em um arquivo, use o awk para extrair essa subseção e, em seguida, compare essa seção com sua expressão regular.

Um exemplo simplificado:

$ cat input
junkjeffjunk

$ awk '{ piece=substr($0, 5, 4); if (piece ~ /jeff/) print piece; }' input
jeff

Para o seu caso:

awk '{ piece=substr($0, 148, 1676); if (piece ~ /your-regex-here/) print piece; }' input
    
por 06.01.2018 / 18:54