Je suis tombé sur cette solution pour imprimer une ligne spécifique à partir d'un fichier texte:
sed '123!d;q' file
Pourquoi sed ne quitte-t-il pas après la première ligne d'entrée dans ce cas?
En anglais, ce sed
programme signifie: pour chaque ligne,
123!
] si le numéro de ligne actuel n'est pas 123, alors [ d
] supprimer la ligne actuelle et démarrer le cycle suivant (c'est-à-dire passer à la ligne suivante);d
commande n'a pas été exécutée), [ q
] quitte sans traiter plus de lignes (mais imprime la ligne courante dans nos affres).Ou si vous préférez, dans la syntaxe du shell:
line_number=0
while IFS= read -r pattern_space; do
line_number=$(($line_number+1))
if [ $line_number -ne 123 ]; then # 123!
continue # d
fi
echo "$pattern_space"; break # q
echo "$pattern_space" # implicit final print (never reached)
done
!
était connecté àd
, non123
.{d;q;}
, ne devrait pasq
s'appliquer à chaque ligne (donc seulement la première)?q
s'applique à chaque ligne où il est exécuté. Mais lorsque le numéro de ligne n'est pas 123, lad
commande est exécutée et sa signification est de passer immédiatement à la ligne d'entrée suivante.sed -n 123p
(imprime la même sortie), sauf qu'il s'arrête après la ligne 123 plutôt que de traiter potentiellement des milliers de lignes supplémentaires avec lesquelles il ne fera jamais rien de toute façon.