Comment mélanger des modèles et des plages numériques dans sed (ou tout autre outil similaire - awk par exemple)? Ce que je veux faire, c'est faire correspondre certaines lignes dans un fichier et supprimer les n lignes suivantes avant de continuer, et je veux faire cela dans le cadre d'un pipeline.
106
+N
modèle est une extension GNU. Remplacez le premiern
par unN
dans votre deuxième exemple pour qu'il inclue la ligne avec le motif./pattern/,+5
définit une plage, qui commence par une ligne contenant "pattern" (/pattern/
) et se termine 5 lignes plus tard (+5
). Le dernier caractèred
est une commande à exécuter sur chaque ligne de cette plage, qui est «supprimer». Dans la deuxième recette, au lieu de faire correspondre une plage, il correspond juste à la ligne contenant le motif (/pattern/
), puis exécute une série de commandes{n;N;N;N;N;d}
:, qui imprime essentiellement la ligne suivante (n
), puis lit et finalement supprime les 4 lignes suivantes (N;N;N;N;d
).sed -e '/pattern/{n;N;N;N;N;d;}' file.txt
something
faites :,sed -E '/^something$/,$d'
où-E
est l'expression régulière étendue de portabilité POSIX.Sans extensions GNU (par exemple sur macOS):
Pour supprimer 5 lignes après un motif (y compris la ligne avec le motif)
Ajouter
-i ''
pour modifier sur place.la source
Des
awk
solutions simples :Supposons que l'expression régulière à utiliser pour rechercher les lignes correspondantes est stockée dans la variable shell
$regex
et le nombre de lignes à ignorer$count
.Si la ligne correspondante doit également être ignorée (les
$count + 1
lignes sont ignorées):Si la ligne correspondante ne doit pas être ignorée (les
$count
lignes après le match sont sautées):Explication:
-v regex="$regex" -v count="$count"
définit desawk
variables basées sur des variables shell du même nom.$0 ~ regex
correspond à la ligne d'intérêt{ skip=count; next }
initialise le compte de sauts et passe à la ligne suivante, sautant effectivement la ligne correspondante; dans la 2ème solution, l'print
avantnext
garantit qu'il n'est pas ignoré.--skip >= 0
décrémente le nombre de sauts et prend des mesures s'il est (toujours)> = 0, ce qui implique que la ligne à portée de main doit être ignorée.{ next }
passe à la ligne suivante, sautant effectivement la ligne actuelle1
est un raccourci couramment utilisé pour{ print }
; c'est-à-dire que la ligne courante est simplement imprimée1
équivaut à{ print }
est qu'il1
est interprété comme un modèle booléen qui, par définition, évalue toujours vrai, ce qui signifie que son action associée (bloc) est exécutée sans condition. Puisqu'il n'y a pas d' action associée dans ce cas, parawk
défaut , l' impression de la ligne.la source
Cela pourrait fonctionner pour vous:
la source
pattern_number.txt
est un fichier à 2 colonnes contenant le motif à faire correspondre dans la 1ère colonne, et dans la 2ème le nombre de lignes à sauter. La premièresed
commande transforme le fichier en unsed
script qui effectue la correspondance et le saut correspondants; ce script est fourni via-f
et stdin (-
) à la 2èmesed
commande. La 2èmesed
commande opère sur un exemple de fichier d'entrée ad-hoc formé à partir de la sortie deseq 21
pour démontrer que cela fonctionne.Utiliser Perl
la source
Cette solution vous permet de passer "n" comme paramètre et elle lira vos motifs à partir d'un fichier:
Le fichier nommé "-" signifie stdin pour awk, il convient donc à votre pipeline
la source