sed supprime les lignes ne contenant pas de chaîne spécifique

Je suis nouveau sur 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 veux supprimer toutes les lignes sauf celles qui contiennent soit la chaîne “text” , soit la 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 ?

Cela pourrait fonctionner pour vous:

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

Vous voulez imprimer uniquement les lignes correspondant à «text» ou à «blah» (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 «texte», l’imprime s’il est apparié et passe à la ligne suivante; le deuxième modèle fait la même chose pour ‘blah’. Si le ‘n’ n’était pas là, une ligne contenant ‘text et blah’ serait imprimée deux fois. Bien que j’aie pu utiliser juste -e '/blah/p' , la symésortinge est meilleure, surtout si vous devez étendre la liste des mots correspondants.

Si votre version de sed prend en charge les expressions régulières étendues (par exemple, GNU sed fait, avec -r ), vous pouvez simplifier cela pour:

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

Vous pourriez simplement le faire grâce à awk,

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