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. em>" 1.txt
Et je m'attendais à ne pas imprimer les lignes de correspondance et le contexte. P> 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. p>
5 Réponses :
Pas trop familier avec SED, mais voici une expression Perl pour faire l'astuce: édition: p> où "xxxx" est ce que vous essayez de faire correspondre . p> p>
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 code> mais rien de plus, je vous suggérerais
xxxx \ r code> et
xxxx \ r \ n code> au cas où d'autres lignes sont
xxxxabc code>.
Vous voulez faire quelque chose de très similaire à celui réponse donnée et comme une ligne unique p>
Notez que vous pouvez le faire sur une ligne: sed -n '/ page 1 / {n; x; d;}; x; 1d; $ g; p' 1.txt code>
@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)
Vous remarquerez que la ligne Il y a une solution AWK simple: p> La commande AWK dit les éléments suivants: p> 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) p> p> grep -v -b1 code> ne fonctionne pas car il va ignorer ces lignes mais les inclura plus tard (en raison du
-b1 code>. Pour vérifier cela, essayez le commande sur:
page 2 code> sera ignorée car cette ligne ne sera pas assortie et que le prochain comme ne sera pas apparié. p>
grep -vf <(grep -B1 "page.*of" file | sed '/^--$/d') file
Vous souhaitez ajouter une option code> à l'extérieur
grep code>. Ce n'est pas terriblement efficace.
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é: p>
awk -vvar = "page. * de. *" '! / $ var / {if (m) imprimer de la BUF; buf = 0 $; m = 1} / $ var / {m = 0} '1.txt code> p>
essayez
fichier TAC | sed -e '/ foo /, + 1d' | TAC code>