Je souhaite supprimer un ou plusieurs numéros de ligne spécifiques d'un fichier. Comment pourrais-je faire cela en utilisant sed?
unix
sed
line-numbers
Justin Ethier
la source
la source
Réponses:
Si vous souhaitez supprimer les lignes 5 à 10 et 12:
Cela imprimera les résultats à l'écran. Si vous souhaitez enregistrer les résultats dans le même fichier:
Cela sauvegardera le fichier
file.bak
et supprimera les lignes données.Remarque: les numéros de ligne commencent à 1. La première ligne du fichier est 1, pas 0.
la source
sed -e '5,$d' file
sed -e '5d' file
. La syntaxe est<address><command>
; où<address>
peut être soit une seule ligne,5
soit une plage de lignes5,10
, et la commanded
supprime la ou les lignes données. Les adresses peuvent également être des expressions régulières ou le signe dollar$
indiquant la dernière ligne du fichier.Vous pouvez supprimer une seule ligne particulière avec son numéro de ligne en
Cela supprimera la ligne sur le numéro de 33 lignes et enregistrera le fichier mis à jour.
la source
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. Merci!et awk aussi
la source
la source
Il s'agit très souvent d'un symptôme d'antipattern. L'outil qui a produit les numéros de ligne pourrait bien être remplacé par un outil qui supprime immédiatement les lignes. Par exemple;
(où
deletelines
est l'utilitaire dont vous pensez avoir besoin) est le même queCela dit, si vous êtes dans une situation où vous devez vraiment effectuer cette tâche, vous pouvez générer un
sed
script simple à partir du fichier de numéros de ligne. Avec humour (mais peut-être un peu confus), vous pouvez le faire avecsed
.Cela accepte un fichier de numéros de ligne, un par ligne, et produit, sur la sortie standard, les mêmes numéros de ligne avec en
d
annexe après chacun. Il s'agit d'unsed
script valide , que nous pouvons enregistrer dans un fichier ou (sur certaines plates-formes) diriger vers une autresed
instance:Sur certaines plates-formes,
sed -f
ne comprend pas l'argument option-
pour signifier une entrée standard, vous devez donc rediriger le script vers un fichier temporaire et le nettoyer lorsque vous avez terminé, ou peut-être remplacer le tiret isolé par/dev/stdin
ou/proc/$pid/fd/1
si votre système d'exploitation (ou shell ) a cela.Comme toujours, vous pouvez ajouter
-i
avant l'-f
option desed
modifier le fichier cible en place, au lieu de produire le résultat sur la sortie standard. Sur les plates-formes * BSDish (y compris OSX), vous devez également fournir un argument explicite-i
; un idiome courant consiste à fournir un argument vide;-i ''
.la source
p
au lieu ded
, avec option-n
(cela ne fonctionnera pas sans-n
et!d
ne fonctionnera pas non plus).Je voudrais proposer une généralisation avec awk.
Lorsque le fichier est constitué de blocs de taille fixe et que les lignes à supprimer sont répétées pour chaque bloc, awk peut fonctionner correctement de cette manière
Dans cet exemple, la taille du bloc est 2000 et je veux imprimer les lignes [1..713] et [1026..1029].
NR
est la variable utilisée par awk pour stocker le numéro de ligne actuel.%
donne le reste (ou module) de la division de deux entiers;nl=((NR-1)%BLOCKSIZE)+1
Ici, nous écrivons dans la variable nl le numéro de ligne à l'intérieur du bloc courant. (voir ci-dessous)||
et&&
sont l'opérateur logique OR et AND .print $0
écrit la ligne complètela source