Filtre linhas com base no comprimento usando sed e grep

3

Como localizar linhas com mais de 100 e menores que 150 caracteres usando sed e grep

    
por user2280915 18.07.2015 / 11:50

2 respostas

7

Ao usar o sed command

sed -nr '/^.{101,149}$/p' infile

Quebrando:

  • -n : sem impressão

A opção -n impedirá a impressão de qualquer coisa, a menos que uma solicitação explícita para impressão seja encontrada ( ^.{101,149}$ " Linhas maiores que 100 (> = 101) e menores que 150 caracteres (< = 149) "). O sinalizador /p usado como uma maneira de ativar a impressão novamente.

  • -r : -r (--regexp-extended)

O -r ativa as expressões regulares estendidas. Se você não quiser usá-lo aqui, você precisa escapar das chaves. Então o comando seria sed -n '/^.\{101,149\}$/p' infile .

  • O ^ é apenas a âncora para o início da linha e o $ para o fim da linha.

  • Um único . corresponde a qualquer caractere único

Então, você entendeu, com sed -nr '/^.{101,149}$/p' infile , estamos procurando uma linha do começo ao fim que tenha ou contenha nossa regra definida.

Esta é uma maneira de duplicar a função de grep com sed , por exemplo: sed -n '/.../p' :)

Usando o gre

grep -E '^.{101,149}$' infile
  • -E é o mesmo que a opção -r do sed, mas para o comando grep . Então, se você não quiser usar, é só escapar das chaves.

Usando o comando awk

awk 'length($0)>100 && length($0)<150' infile
  • length retorna o comprimento da linha. No awk, o $0 especifica a linha inteira. Então, se o comprimento da linha estiver entre 100 e 150, será impresso.
por devWeek 18.07.2015 / 12:24
1

Outra maneira de fazer isso usando bash :

while read l; do nc=$(<<< "$l" wc -c); [ $nc -ge 101 ] && [ $nc -le 149 ] && echo "$l"; done < file

Expandido em um script:

#!/bin/bash
while read l; do
    nc=$(<<< "$l" wc -c)
    if [ $nc -ge 101 ]; then
        if [ $nc -le 149 ]; then
            echo "$l"
        fi
    fi
done < file
    
por kos 18.07.2015 / 19:04

Tags