Como apagar as linhas de um arquivo que não contém ponto?

10

Eu tenho um arquivo que contém dados incluindo URLs. Mas existem várias linhas que não são URLs. Como posso removê-los usando os comandos do terminal do Ubuntu?

Este é o arquivo de exemplo para referência: Dados de amostra

com.blendtuts/S
°=
com.blengineering.www/:http
±=

Eu quero ter a saída:

com.blendtuts/S
com.blengineering.www/:http

As linhas extras indesejadas não possuem nenhum ponto. Por isso, quero remover as linhas sem pontos

    
por Jaffer Wilson 08.11.2016 / 11:41

6 respostas

30

Uma maneira com sed

sed '/\./!d' file
  • /\./ corresponde ao ponto literal (com escape de \ porque senão . corresponde a qualquer caractere)
  • !d exclui tudo, exceto o padrão correspondente

Se você quiser editar o arquivo, adicione -i ao comando após o teste. (Você também pode adicionar .bak ao -i flag sed -i.bak ... para criar um backup local do arquivo.)

sed -i '/\./!d' file
    
por Zanna 08.11.2016 / 11:45
26

Você pode usar tudo como um ponto em um novo arquivo:

grep "\."  file > newfile

Dessa forma, você pode salvar seu arquivo antigo.

    
por Fl.pf. 08.11.2016 / 12:07
10

Ou mantenha as linhas que contêm um ponto

sed -ni.bak '/\./p' infile
    
por αғsнιη 08.11.2016 / 11:50
8

Acho que awk é o último ausente da festa:

$ awk -F\. 'NF>1' file
com.blendtuts/S
com.blengineering.www/:http

Isso define o separador de campo para o ponto. Então, é uma questão de imprimir as linhas que têm pelo menos dois campos: isso significa que pelo menos um ponto ocorre.

    
por fedorqui 08.11.2016 / 12:58
6

Usando o perl:

perl -i -ne 'print if /\./' /path/to/file
    
por abligh 08.11.2016 / 12:22
6

Você pode fazer isso facilmente com o vim. Se você estiver confortável usando o vim como editor de texto (abrindo, editando e gravando arquivos), faça o seguinte:

:g!/\./d

Se você não se sentir confortável usando o vim, ou se preferir usá-lo como uma ferramenta de linha de comando, pode simplesmente fazer a partir do terminal:

vim file -c "g!/\./d" -c "wq"

Você pode modificar isso para salvar em um novo arquivo:

vim file -c "g!/\./d" -c "w newfile" -c "q!"

Isto usa o comando "global" do vim, que aplica um comando ex a todas as linhas correspondentes (ou não correspondentes) a um regex. Neste caso, o comando é "(d) elete", e será aplicado a todos os comandos que não correspondam ao regex \.

    
por DJMcMayhem 08.11.2016 / 22:49