10
votes

Combiner -v drapeau et drapeau -und in grep

J'ai besoin de rechercher un fichier pour une chaîne, supprimez toute ligne contenant la chaîne et retirez également les deux lignes qui suivent une ligne contenant la chaîne. J'espérais pouvoir accomplir cela en utilisant quelque chose comme ça ... xxx

... mais malheureusement cela n'a pas fonctionné. Y a-t-il un simple je peux le faire avec Grep ou une autre commande shell?


0 commentaires

4 Réponses :


7
votes

Les travaux suivants fonctionnent à la fois avec GNU SED et avec OS X.

$ sed '/two/{N;N;d;}' temp.txt
one
five
  • Trouvez la ligne correspondant deux code> li>
  • Lisez dans deux autres lignes li>
  • les supprimer li> ul> p>


2 commentaires

Votre réponse et @ Johnkugelman sont concises, ils travaillent tous deux sur GNU / Linux et ne travaillent pas non plus sur OS X (pas une énorme affaire pour moi pour cette tâche particulière). Pour fournir une brève explication de la syntaxe, la réponse acceptée va à vous. Merci.


Ajouter un point-virgule après le d et. Appliquez l'attelle et cela devrait également fonctionner sur MacOS X.



3
votes

avec GNU SED:

sed '/two/,+2d' temp.txt


1 commentaires

La seule chose à laquelle je puisse penser, c'est peut-être qu'elles utilisent un plus ancien, sans GNU SED, sans l'option + numéro . Mais depuis que cela fonctionne (et que je n'aime pas conduire les bowards de route), voici un vote pour l'inverser.



3
votes

Vous pouvez le faire avec awk , conformément à la transcription suivante: xxx

Il commence fondamentalement un compteur de lignes à jeter (3) chaque fois qu'il trouve la chaîne deux sur une ligne. Il lance ensuite ces lignes jusqu'à ce que le compteur de saut atteigne zéro. Toute ligne qui n'est pas marquée pour sauter est imprimée.


1 commentaires

Cela présente l'avantage de la manutention un deux trois trois trois quatre cinq un cinq correctement.



1
votes

Voici un moyen de le faire avec Perl:

$ perl -ne'if (/two/){$x=<>;$x=<>;}else{print}' temp.txt 
one
five


0 commentaires