Je l'utilise
cat foo.txt | sed '/bar/d'
supprimer les lignes contenant la chaîne bar
dans le fichier.
Je voudrais cependant supprimer ces lignes et la ligne directement après . De préférence sed
, awk
ou tout autre outil disponible dans MinGW32.
C'est une sorte d'inverse de ce que je peux obtenir grep
avec -A
et -B
imprimer des lignes de correspondance ainsi que des lignes avant / après la ligne correspondante.
Y a-t-il un moyen facile d'y parvenir?
text-processing
sed
awk
replace
jakub.g
la source
la source
Réponses:
Si vous avez GNU sed (donc Linux ou Cygwin non-embarqué):
Si vous avez
bar
deux lignes consécutives, cela effacera la deuxième ligne sans l’analyser. Par exemple, si vous avez un fichier 3 lignesbar
/bar
/foo
, lafoo
ligne restera.la source
bar
donc celui-ci est très facile à mémoriser.sed '/bar/d'
si vous voulez juste "Supprimer la ligne contenant certaines chaînes" et pas la suivante.sed '/math/q'
sed '/bar/d'
Si
bar
peut se produire sur des lignes consécutives, vous pouvez faire:qui peut être adapté pour supprimer plus de 2 lignes en modifiant les 2 précédentes avec le nombre de lignes à supprimer, y compris celle correspondante.
Sinon, cela se fait facilement
sed
avec la solution de @MichaelRollins ou:la source
/bar/
par/bar|baz|whatever/
. Danssed
cette syntaxe ne semble pas fonctionner.sed
d’utiliser des expressions régulières "étendues". Plus d'informations ici: gnu.org/software/sed/manual/html_node/… . S'il vous plaît noter que cela est applicable àgrep
ainsi. Voici mon exemple de travail:echo $'0a\n1b\n2c' | sed '/0a\|1b/d'
.Je ne parle pas couramment sed, mais il est facile de le faire dans awk:
Le script awk lit: pour une ligne contenant des barres, obtenez la ligne suivante (getline), puis ignorez tous les traitements ultérieurs (suivants). Le motif 1 à la fin imprime les lignes restantes.
Mise à jour
Comme indiqué dans le commentaire, la solution ci-dessus ne fonctionnait pas avec consécutif
bar
. Voici une solution révisée qui en tient compte:Nous continuons maintenant à lire pour sauter tous les / bar / lignes.
la source
grep -A
100%, vous devez également gérerbar
correctement n'importe quel nombre de lignes consécutives (en supprimant le bloc entier et 1 ligne après).Vous voudrez utiliser les capacités de script de sed pour accomplir cela.
Échantillon de données:
La commande "N" ajoute la ligne suivante dans l’espace du modèle. Ceci combiné avec la ligne de la correspondance de modèle (/ bar /) sera les lignes que vous souhaitez supprimer. Vous pouvez ensuite supprimer normalement avec la commande "d".
la source
sed -e '/bar/{N;d}' sample1.txt
Si une ligne immédiatement après une correspondance doit être supprimée, votre
sed
programme devra envisager des correspondances consécutives. En d'autres termes, si vous supprimez une ligne après une correspondance qui correspond également, alors vous devriez probablement supprimer également la ligne qui suit.Il est simplement mis en œuvre - mais vous devez regarder un peu en arrière.
Cela fonctionne en échangeant des espaces de maintien et de motif pour chaque ligne lue - de sorte que la dernière ligne puisse être comparée au courant à chaque fois. Ainsi, lors de la
sed
lecture d'une ligne, il échange le contenu de ses tampons. La ligne précédente correspond alors au contenu de son tampon d'édition, tandis que la ligne actuelle est mise en attente.Donc,
sed
vérifie la correspondance sur la ligne précédentematch
, et si elle!
n’est pas trouvée, les deux expressions de la{
fonction}
sont exécutées.sed
serag
et l'espace de prise en réécrivant l'espace de travail - ce qui signifie que la ligne courante est alors dans les deux espaces de maintien et motif - et il le//
vérifier pour un match à son expression régulière plus récemment compilé -match
- et si elle ne fonctionne pas ,match
il estp
imprimé.Cela signifie qu'une ligne n'est imprimée que si ce n'est pas le cas et la ligne immédiatement précédente ne l'est pas . Il supprime également tout échange inutile de séquences d' es.
match
match
match
Si vous voulez une version capable de supprimer un nombre arbitraire de lignes apparaissant après,
match
il vous faudra un peu plus de travail:... remplacez le nombre 5 par le nombre de lignes (y compris la ligne correspondante) que vous souhaitez supprimer ...
la source