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 ... ... mais malheureusement cela n'a pas fonctionné. Y a-t-il un simple je peux le faire avec Grep ou une autre commande shell? P> p>
4 Réponses :
Les travaux suivants fonctionnent à la fois avec GNU SED et avec OS X.
$ sed '/two/{N;N;d;}' temp.txt one five
deux code> li>
- Lisez dans deux autres lignes li>
- les supprimer li>
ul> p>
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.
avec GNU SED:
sed '/two/,+2d' temp.txt
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 code>. Mais depuis que cela fonctionne (et que je n'aime pas conduire les bowards de route), voici un vote pour l'inverser.
Vous pouvez le faire avec Il commence fondamentalement un compteur de lignes à jeter (3) chaque fois qu'il trouve la chaîne awk code>, conformément à la transcription suivante:
deux code> 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. P> p>
Cela présente l'avantage de la manutention un deux trois trois trois quatre cinq code> →
un cinq code> correctement.
Voici un moyen de le faire avec Perl:
$ perl -ne'if (/two/){$x=<>;$x=<>;}else{print}' temp.txt one five