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.baket 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, 5soit une plage de lignes 5,10, et la commande dsupprime 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ù deletelinesest 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 sedscript 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 dannexe après chacun. Il s'agit d'un sedscript valide , que nous pouvons enregistrer dans un fichier ou (sur certaines plates-formes) diriger vers une autre sedinstance:
sed 's%$%d%' linenumbers | sed -f - logfile
Sur certaines plates-formes, sed -fne 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/stdinou /proc/$pid/fd/1si votre système d'exploitation (ou shell ) a cela.
Comme toujours, vous pouvez ajouter -iavant l' -foption de sedmodifier 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 ''.
pau lieu de d, avec option -n(cela ne fonctionnera pas sans -net !dne 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)+1Ici, 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 |
+-----+------+----------+------------+