86 votes

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

Je suis nouveau dans 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 la chaîne 'texte'. y ou la chaîne 'blah', donc mon fichier de sortie ressemble à ça :

some text here
blah blah 123
some other text as well

Avez-vous une idée de la façon dont vous pouvez le faire en utilisant sed ?

5 votes

La réponse doit-elle utiliser sed ? grep le ferait très facilement.

1 votes

123voto

potong Points 18653

Cela pourrait marcher pour vous :

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

1 votes

Comment puis-je par exemple spécifier que du texte ou du bla-bla ne peut apparaître que dans la dernière colonne ?

3 votes

@lovedynasty Si vous voulez dire à la fin de la ligne vous devez utiliser $ : '/text$\|blah$/!d'

0 votes

@potong Cela ne fonctionne pas si je remplace le séparateur char / par #, une idée pourquoi ?

18voto

Jonathan Leffler Points 299946

Vous voulez imprimer uniquement les lignes qui correspondent soit à "text", soit à "blah" (ou aux deux), la distinction entre "et" et "ou" étant plutôt cruciale.

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

El -n signifie ne pas imprimer par défaut. Le premier motif recherche 'text', l'imprime s'il est trouvé et passe à la ligne suivante ; le second motif fait de même pour 'blah'. Si le 'n' n'était pas présent, une ligne contenant 'text et blah' serait imprimée deux fois. Bien que j'aurais pu utiliser simplement -e '/blah/p' la symétrie est meilleure, surtout si vous avez besoin d'allonger la liste des mots appariés.

Si votre version de sed supporte les expressions régulières étendues (par exemple, GNU sed fait, avec -r ), alors vous pouvez simplifier cela à :

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

11voto

Avinash Raj Points 23485

Vous pourriez simplement le faire à travers awk,

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

0voto

Viktor Csomor Points 1

Vous cherchez le grep ? Voici un exemple pour rechercher des textes différents.

cat yourfile.txt | grep "text\|blah"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X