web-dev-qa-db-fra.com

sed supprimer des lignes ne contenant pas de chaîne spécifique

Je suis nouveau à sed et j'ai la question suivante. Dans cet exemple:

some text here
blah blah 123
another new line
some other text as well
another line

Je souhaite supprimer toutes les lignes sauf celles contenant l'une des deux chaînes 'text' et ou chaîne 'blah', donc mon fichier de sortie ressemble à ceci:

some text here
blah blah 123
some other text as well

Des astuces pour savoir comment cela peut être fait en utilisant sed?

58
user1246172

Cela pourrait fonctionner pour vous:

sed '/text\|blah/!d' file
some text here
blah blah 123
some other text as well
96
potong

Vous souhaitez imprimer uniquement les lignes qui correspondent à "texte" ou à "bla" (ou aux deux), où la distinction entre "et" et "ou" est plutôt cruciale.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file

Le -n Signifie ne pas imprimer par défaut. Le premier motif recherche 'text', l'imprime s'il est mis en correspondance et passe à la ligne suivante; le second motif fait la même chose pour 'blah'. Si le "n" n'y était pas, une ligne contenant "text et blah" serait imprimée deux fois. Bien que j'aurais pu utiliser seulement -e '/blah/p', La symétrie est meilleure, surtout si vous avez besoin d'étendre la liste des mots correspondants.

Si votre version de sed prend en charge les expressions régulières étendues (par exemple, GNU sed, avec -r)), Vous pouvez simplifier la procédure. à:

sed -r -n -e '/text|blah/p' your_data_file
16
Jonathan Leffler

Vous pouvez simplement le faire à travers awk,

$ awk '/blah|text/' file
some text here
blah blah 123
some other text as well
5
Avinash Raj