web-dev-qa-db-fra.com

Comment supprimer les lignes d'un fichier ne contenant pas de point?

J'ai un fichier qui contient des données, y compris des URL. Mais il existe différentes lignes qui ne sont pas des URL. Comment puis-je les supprimer en utilisant les commandes du terminal Ubuntu?

Voici le fichier exemple pour référence: exemple de données

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

Je veux avoir la sortie:

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

Les lignes indésirables supplémentaires n'ont pas de point. Par conséquent, je veux supprimer les lignes sans points

10
Jaffer Wilson

One way avec sed

sed '/\./!d' file
  • /\./ correspond à un point littéral (échappé avec \ car sinon . correspond à n'importe quel caractère)
  • !d efface tout sauf le motif correspondant

Si vous souhaitez modifier le fichier à la place, ajoutez -i à la commande après le test. (Vous pouvez également ajouter .bak à l'indicateur -i pour sed -i.bak ... afin de créer une sauvegarde locale du fichier.)

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

Vous pouvez tout grep avec un point dans un nouveau fichier:

grep "\."  file > newfile

De cette façon, vous pourrez sauvegarder votre ancien fichier.

26
Fl.pf.

Ou gardez les lignes qui contiennent un point,

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

Je pense que awk est le dernier manquant pour le parti:

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

Cela définit le séparateur de champ sur le point. Ensuite, il s’agit d’imprimer les lignes qui ont au moins deux champs: cela signifie qu’au moins un point apparaît.

8
fedorqui

Vous pouvez le faire assez facilement avec vim. Si vous maîtrisez bien utiliser vim en tant qu'éditeur de texte (ouverture, édition et écriture de fichiers), procédez comme suit:

:g!/\./d

Si vous n'êtes pas à l'aise avec vim, ou si vous préférez l'utiliser comme outil de ligne de commande, vous pouvez simplement le faire depuis le terminal:

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

Vous pouvez légèrement le modifier pour enregistrer dans un nouveau fichier:

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

Ceci utilise la commande "globale" de vim, qui applique une commande ex à chaque ligne correspondant (ou non) à une expression régulière. Dans ce cas, la commande est "(d) elete" et sera appliquée à toutes les commandes ne correspondant pas à l'expression régulière \.

6
DJMcMayhem

Utiliser Perl:

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