101 votes

sed: supprimer les n lignes suivantes d'un modèle

Comment pourrais-je le mélange de motifs et de plages numériques dans les sed (ou tout autre outil de awk par exemple)? Ce que je veux faire est de correspondre à certaines lignes dans un fichier, et de supprimer les n prochaines lignes avant de procéder, et je veux le faire dans le cadre d'un pipeline.

180voto

dogbane Points 85749

Je vais avoir un aller à cela.

Pour supprimer 5 lignes d'après un modèle (y compris la ligne avec le modèle):

sed -e '/pattern/,+5d' file.txt

Pour supprimer 5 lignes d'après un modèle (à l'exclusion de la ligne avec le modèle):

sed -e '/pattern/{n;N;N;N;N;d}' file.txt

3voto

potong Points 18653

Cela pourrait fonctionner pour vous:

cat <<! >pattern_number.txt
> 5 3
> 10 1
> 15 5
> !
sed 's|\(\S*\) \(\S*\)|/\1/,+\2{//!d}|' pattern_number.txt |
sed -f - <(seq 21)
1 
2
3
4
5
9
10
12
13
14
15
21

2voto

glenn jackman Points 69748

Cette solution vous permet de passer des "n" comme paramètre et elle va lire vos modèles à partir d'un fichier:

awk -v n=5 '
    NR == FNR {pattern[$0]; next}
    {
        for (patt in pattern) {
            if ($0 ~ patt) {
                print # remove if you want to exclude a matched line
                for (i=0; i<n; i++) getline
                next
            }
        }
        print
    }
' file.with.patterns -

Le fichier nommé "-" signifie stdin pour awk, c'est donc approprié pour votre pipeline

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X