Je souhaite supprimer un ou plusieurs numéros de ligne spécifiques d'un fichier. Comment ferais-je cela en utilisant sed?Supprimer des numéros de ligne spécifiques d'un fichier texte en utilisant sed?
Répondre
Si vous voulez supprimer des lignes 5 à 10 et 12:
sed -e '5,10d;12d' file
Cela affichera 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
Ceci sauvegardera le fichier jusqu'à file.bak
et supprimer les lignes données.
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
et awk ainsi
awk 'NR!~/^(5|10|25)$/' file
NB: Cette ligne awk a fonctionné plus sûrement pour moi que la variante sed (entre OS-X et Ubuntu Linux) –
Notez que cela ne supprime rien dans le fichier. Il imprime simplement le fichier sans ces lignes sur stdout. Vous devez également rediriger la sortie vers un fichier temporaire, puis déplacer le fichier temporaire pour remplacer l'original. – mivk
Je voudrais proposer une généralisation avec awk.
Lorsque le fichier est fait par des blocs de taille fixe et les lignes à supprimer sont répétées pour chaque bloc, awk peut fonctionner correctement de 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 de la le 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 le module) de la division de deux nombres entiers;nl=((NR-1)%BLOCKSIZE)+1
Ici, nous écrivons dans la variable nl le numéro de ligne à l'intérieur du bloc actuel. (Voir ci-dessous)||
et&&
sont l'opérateur logique OU et ET.print $0
écrit la gamme complète
Why ((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 |
+-----+------+----------+------------+
J'admire la façon dont vous vivez à votre nom induisant la folie. –
Vous pouvez supprimer une seule ligne particulière avec son numéro de ligne par fichier sed -i '33d'
Cette va supprimer la ligne sur 33 numéro de ligne et enregistrer le fichier mis à jour.
Ceci est très souvent un symptôme d'un anti-modèle. L'outil qui a produit les numéros de ligne peut bien être remplacé par un qui supprime les lignes tout de suite.Par exemple;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(où deletelines
est l'utilitaire que vous imaginez que vous avez besoin) est le même que
grep -v error logfile
Cela dit, si vous êtes dans une situation où vous avez vraiment besoin pour effectuer cette tâche, vous peut générer un script sed
simple à partir du fichier de numéros de ligne. Humoureusement (mais peut-être légèrement confuse), vous pouvez le faire avec sed
.
sed 's%$%d%' linenumbers
Il accepte un fichier de numéros de ligne, une par ligne, et produit, sur la sortie standard, les mêmes numéros de ligne avec d
ajoutés après chaque. Ceci est un script sed
valide, que nous pouvons enregistrer dans un fichier, ou (sur certaines plates-formes) conduit à une autre instance sed
:
sed 's%$%d%' linenumbers | sed -f - logfile
Sur certaines plateformes, sed -f
ne comprend pas l'argument de l'option -
signifie l'entrée standard , donc vous devez rediriger le script vers un fichier temporaire, et le nettoyer lorsque vous avez terminé, ou peut-être remplacer le tiret seul avec /dev/stdin
ou /proc/$pid/fd/1
si votre OS (ou shell) a cela.
Comme toujours, vous pouvez ajouter -i
avant l'option -f
pour que le fichier cible sed
soit modifié, 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 commun est de fournir un argument vide; -i ''
. Pouvez-vous donner un exemple plus précis de ce que vous voulez?
Je ne suis pas tout à fait d'accord avec "symptôme d'un antipattern". Les types de fichiers basés sur les annotations (par exemple, XML ou JSON) nécessitent des lignes spécifiques à la fin pour être des fichiers valides. Dans ce cas, c'est souvent l'approche la plus raisonnable pour supprimer ces lignes, mettre dans le fichier ce que vous voulez ajouter, puis rajouter ces lignes, parce que mettre les lignes directement entre elles peut être beaucoup plus difficile et va à l'encontre le désir potentiel d'éviter les outils supplémentaires comme sed autant que vous le pouvez. –
- 1. supprimer des règles spécifiques en ligne CSS
- 2. Supprimer l'historique des appels/SMS pour des numéros spécifiques?
- 3. sed pour supprimer des URL d'un fichier
- 4. Supprimer les numéros de ligne de SyntaxHighlighter
- 5. Supprimer la ligne contient des mots/phrases spécifiques avec PHP
- 6. Supprimer des devis avec SED
- 7. Comment supprimer du texte ou des lignes vides avec sed?
- 8. script awk/sed pour supprimer du texte
- 9. Fichier batch pour supprimer des dossiers spécifiques
- 10. supprimer les 5 premiers caractères sur une ligne d'un fichier texte sous Linux avec sed
- 11. Très basique de remplacement en utilisant sed
- 12. CamelCase supprimer des numéros
- 13. Supprimer une ligne spécifique d'un fichier texte?
- 14. Supprimer une ligne d'un fichier en utilisant un numéro de ligne variable
- 15. Boîte de texte Windows Forms avec des numéros de ligne?
- 16. multiligne sed en utilisant des backreferences
- 17. Comment supprimer des nœuds spécifiques à partir d'un fichier XML en utilisant LINQ en C#
- 18. 2 lignes dans un grand fichier texte à l'aide sed
- 19. Ajout de texte à la première ligne existante avec Sed
- 20. Filtrage des émoticônes en utilisant sed
- 21. Comment supprimer une ligne correspondante, la ligne ci-dessus et celle située en dessous, en utilisant sed?
- 22. supprimer des entrées spécifiques
- 23. Comment remplacer quelques correspondances dans une ligne en utilisant sed
- 24. Impression de lignes spécifiques d'un fichier texte dans Windows Batch
- 25. Comment puis-je supprimer la dernière ligne d'un fichier texte en utilisant l'invite de commande?
- 26. Comment supprimer des caractères spécifiques d'une chaîne particulière en Java?
- 27. Comment supprimer une ligne sur deux avec sed?
- 28. pour supprimer des lignes spécifiques dans un fichier csv en utilisant python
- 29. une ligne en utilisant sed et bc ensemble?
- 30. texte sed + sur une ligne spécifique après une IP
Comment allez-vous décider quelles lignes supprimer? –
Basé sur le numéro de ligne –