8
votes

Comment supprimer une ligne correspondante et la précédente?

J'ai besoin de supprimer une ligne correspondante et une précédente. E.g Dans le fichier ci-dessous, j'ai besoin de supprimer les lignes 1 et 2.

J'ai essayé "grep -v -b 1" page " de. " 1.txt Et je m'attendais à ne pas imprimer les lignes de correspondance et le contexte.

J'ai essayé le Comment supprimer une ligne de correspondance, la ligne ci-dessus et celle en dessous, en utilisant SED? mais ne pouvait pas comprendre l'utilisation de SED. xxx


5 Réponses :


1
votes

Pas trop familier avec SED, mais voici une expression Perl pour faire l'astuce: xxx

édition:

où "xxxx" est ce que vous essayez de faire correspondre .


3 commentaires

Et l'utilisation inutile du chat devrait aller.


Oui, certaines œuvres de cette solution peuvent être critiquées, mais le concept général est solide et le code exemple implémente assez bien. C'est facile à comprendre. Assez pour que quelqu'un commence quelqu'un. Et c'est tout le point d'une réponse ici. Il n'a pas besoin d'être parfait. J'aime cette réponse. Cela m'a certainement aidé avec un problème similaire à la question initiale.


Si vous souhaitez supprimer des lignes contenant xxxx mais rien de plus, je vous suggérerais xxxx \ r et xxxx \ r \ n au cas où d'autres lignes sont xxxxabc .



13
votes

Vous voulez faire quelque chose de très similaire à celui réponse donnée xxx

et comme une ligne unique xxx


3 commentaires

Notez que vous pouvez le faire sur une ligne: sed -n '/ page 1 / {n; x; d;}; x; 1d; $ g; p' 1.txt


@Beta: Bien sûr, les lignes supplémentaires, etc. sont simplement une annotation


Pourquoi cela a-t-il été évolué? Il fait ce que l'asker de la question voulait (et est dans SED de démarrer)



4
votes

grep -v -b1 ne fonctionne pas car il va ignorer ces lignes mais les inclura plus tard (en raison du -b1 . Pour vérifier cela, essayez le commande sur: xxx

Vous remarquerez que la ligne page 2 sera ignorée car cette ligne ne sera pas assortie et que le prochain comme ne sera pas apparié.

Il y a une solution AWK simple: xxx

La commande AWK dit les éléments suivants:

si la ligne actuelle a cette "page .. . de ", alors il signalera que vous n'avez pas trouvé de ligne valide. Si vous ne trouvez pas cette chaîne, vous imprimez la ligne précédente (stockée dans BUF) et réinitialisez la mémoire tampon à la ligne actuelle (donc le forçant à décalage de 1)


0 commentaires

2
votes
grep -vf <(grep -B1 "page.*of" file | sed '/^--$/d') file

1 commentaires

Vous souhaitez ajouter une option à l'extérieur grep . Ce n'est pas terriblement efficace.



0
votes

Merci, j'essayais d'utiliser la commande AWK donnée par FOO BAH supprimer la ligne correspondante et la précédente. Je dois l'utiliser plusieurs fois, donc pour la pièce correspondante que j'utilise une variable. La commande AWK fonctionne, mais lors de l'utilisation d'une variable, elle ne fonctionne pas (c'est-à-dire qu'elle ne supprime pas la correspondance et la prev. Ligne). J'ai essayé:

awk -vvar = "page. * de. *" '! / $ var / {if (m) imprimer de la BUF; buf = 0 $; m = 1} / $ var / {m = 0} '1.txt


0 commentaires