Je souhaite supprimer un ou plusieurs numéros de ligne spécifiques d'un fichier. Comment pourrais-je faire cela en utilisant sed?
Je souhaite supprimer un ou plusieurs numéros de ligne spécifiques d'un fichier. Comment pourrais-je faire cela en utilisant sed?
Réponses:
Si vous souhaitez supprimer les lignes 5 à 10 et 12:
sed -e '5,10d;12d' file
Cela imprimera les résultats à l'écran. Si vous souhaitez enregistrer les résultats dans le même fichier:
sed -i.bak -e '5,10d;12d' file
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.
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 lignes 5,10
, et la commande d
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
sed -i '33d' file
Cela supprimera la ligne sur le numéro de 33 lignes et enregistrera le fichier mis à jour.
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. Merci!
et awk aussi
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
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;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(où deletelines
est l'utilitaire dont vous pensez avoir besoin) est le même que
grep -v error logfile
Cela 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 avec sed
.
sed 's%$%d%' linenumbers
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'un sed
script valide , que nous pouvons enregistrer dans un fichier ou (sur certaines plates-formes) diriger vers une autre sed
instance:
sed 's%$%d%' linenumbers | sed -f - logfile
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 de sed
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 ''
.
p
au lieu de d
, 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
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
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èteWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+