Como excluir 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 removê-los usando os comandos do terminal Ubuntu?

Aqui está o arquivo de amostra para referência: Dados da 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 têm nenhum ponto. Por isso, quero remover as linhas sem pontos

Jaffer Wilson
fonte

Respostas:

30

Uma maneira com sed

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

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

sed -i '/\./!d' file
Zanna
fonte
26

Você pode grep tudo com um ponto em um novo arquivo:

grep "\."  file > newfile

Dessa forma, você pode salvar seu arquivo antigo.

Fl.pf.
fonte
10

Ou mantenha as linhas que contêm um ponto ,

sed -ni.bak '/\./p' infile
αғsнιη
fonte
8

Eu acho awkque é o último que falta para a festa:

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

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

fedorqui
fonte
3
Uma solução awk mais simples seria fazê-lo da mesma maneira que o grep: awk '/\./' file- isto é, imprimir apenas as linhas que contêm o caractere '.'.
precisa
@ChrisMidgley good one! Uma vez que este é o que a resposta com grepjá foi sugerido, eu preferia ir com algum awkmaterial espec�ico :)
fedorqui
6

Usando perl:

perl -i -ne 'print if /\./' /path/to/file
abligh
fonte
6

Você pode fazer isso facilmente com o vim. Se você se sentir confortável usando o vim como um editor de texto (abertura, edição e gravação de arquivos), faça o seguinte:

:g!/\./d

Se você não se sente confortável em usar o vim, ou prefere usá-lo como uma ferramenta de linha de comando, basta fazê-lo no terminal:

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

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

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

Isso usa o comando "global" do vim, que aplica um comando ex a todas as linhas que correspondem (ou não) a um regex. Nesse caso, o comando é "(d) elete" e será aplicado a todos os comandos que não corresponderem à regex\.

James
fonte