6
votes

Supprimer tout avant le motif, y compris le motif avec awk ou sed

111 222 333 444 555
666 777 888 999 000

1 commentaires

Essayez de ne pas penser et spécifier des problèmes en termes de ce que vous souhaitez supprimer à partir d'un fichier, mais à la place de ce que vous souhaitez sélectionner dans un fichier - cela fait souvent une différence pour la lisibilité, la maintenabilité, etc. des solutions que vous ( et nous) montez avec votre problème.


3 Réponses :


12
votes

Il suffit de définir un drapeau chaque fois que le motif est trouvé. À partir de ce moment, imprimez les lignes: xxx

ou aussi xxx

il recherche modèle dans chaque ligne. Lorsqu'il est trouvé, la variable p est définie sur 1. Le point difficile est que les lignes sont simplement imprimées lorsque p> 0 , de sorte que les lignes suivantes seront imprimées.

Ceci est un cas spécifique de Comment sélectionner des lignes entre deux modèles? quand il n'y a pas de tel deuxième modèle.


5 commentaires

Suivant pourrait être enregistré ... awk 'p; / motif / {p = 1}' ;)


Je dois dire que votre réponse d'origine est plus facile à lire et à comprendre. particulièrement si le script était long.


awk 'p; / motif / {p = 1} 'fichier'


Méfiez-vous que lorsque le motif ne se trouve pas du tout, cela supprime tout.


@Martinvonwittich vous avez raison. Pour éviter cela, vous pouvez lire deux fois le fichier: une fois pour voir si le motif est trouvé et définir un drapeau. Ensuite, pour l'imprimer complètement ou à partir du motif: awk 'fnr == nr {if (/ motif /) trouvé = 1; Suivant} p || !trouvé; / motif / {p = 1} 'Fichier de fichier



8
votes
sed '0,/pattern/d' file

3 commentaires

Oui. Sauf si modèle est trouvé en première ligne. Mieux commencer la plage dans 0 .


@Birei belle suggestion. !


Méfiez-vous que lorsque le motif ne se trouve pas du tout, cela supprime tout.



2
votes

Un autre SED Solution: XXX


1 commentaires

Cela semble être la seule solution qui ne supprime pas tout lorsque le motif n'est pas trouvé.