Come eliminare le righe da un file che non contengono punti?


10

Ho un file che contiene dati inclusi gli URL. Ma ci sono varie linee che non sono URL. Come posso rimuoverli usando i comandi del terminale Ubuntu?

Ecco il file di esempio per riferimento: Dati di esempio

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

Voglio avere l'output:

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

Le linee extra indesiderate non hanno punti. Quindi, voglio rimuovere le linee senza punti

Risposte:


30

Un modo con sed

sed '/\./!d' file
  • /\./abbina punto letterale (scappato \perché altrimenti .corrisponde a qualsiasi carattere)
  • !d elimina tutto tranne lo schema corrispondente

Se si desidera modificare il file in atto, aggiungere -ial comando dopo il test. (È inoltre possibile aggiungere .bakal -iflag sed -i.bak ...per creare un backup locale del file.)

sed -i '/\./!d' file

26

Puoi grep tutto con un punto in un nuovo file:

grep "\."  file > newfile

In questo modo puoi salvare il tuo vecchio file.


10

Oppure mantieni le linee che contengono un punto ,

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

8

Penso che awksia l'ultimo mancante alla festa:

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

Questo imposta il separatore di campo sul punto. Quindi, si tratta di stampare quelle linee che hanno almeno due campi: questo significa che si verifica almeno un punto.


3
Una soluzione awk più semplice sarebbe quella di farlo nella stessa maniera di grep: awk '/\./' file- cioè, stampare solo le righe che contengono il carattere '.'.
Chris Midgley,

@ChrisMidgley bravo! Dato che questa è la risposta grepgià suggerita, ho preferito andare con alcune awkcose specifiche :)
fedorqui

6

Utilizzando perl:

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

6

Puoi farlo abbastanza facilmente con vim. Se hai dimestichezza con vim come editor di testo (apertura, modifica e scrittura di file), procedi nel seguente modo:

:g!/\./d

Se non ti senti a tuo agio con vim, o preferiresti usarlo come strumento da riga di comando, puoi semplicemente farlo dal terminale:

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

È possibile modificarlo leggermente per salvarlo in un nuovo file:

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

Questo utilizza il comando "globale" di vim, che applica un comando ex a ogni riga che corrisponde (o non corrisponde) a una regex. In questo caso, il comando è "(d) elete" e verrà applicato a tutti i comandi che non corrispondono al regex\.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.