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

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

26

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

grep "\."  file > newfile

Dessa forma, você pode salvar seu arquivo antigo.


10

Ou mantenha as linhas que contêm um ponto ,

sed -ni.bak '/\./p' infile

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.


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

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\.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.