SED: copie des lignes à partir d'un fichier de ligne spécifique dans un autre fichier
Je peux le faire à l'aide de l'exemple suivant. La 1ère commande permet d'afficher les lignes de 16 à...80 de file1
à patch
, tandis que le 2ème sera insérer le contenu de patch
, après la ligne 18 à file2
:
sed -n 16,80p file1>patch
sed -i 18rpatch file2
Cependant, je voudrais copier directement à partir d'un fichier à l'autre sans l'aide d'un fichier temporaire dans un entre-deux, en une ligne de commande à l'aide de sed (pas awk, etc.). Je suis sûr que cela est possible, il suffit de ne pas savoir comment.
Ce n'est pas possible.
Pourquoi pas?!
Eh bien, il pourrait être si vous connaissez le nombre exact de lignes de chaque fichier, et vous ne voulez pas utiliser -je, mais c'est beaucoup plus d'efforts que ce que vous avez actuellement. Alternativement, vous pouvez simplement utiliser awk.
Eh bien, si sed n'est pas une option, alors peut-être awk serait (selon la complexité de la commande). S'il vous plaît ajouter une réponse (à l'aide de awk) ci-dessous afin de prendre un coup d'oeil.
Pourquoi pas?!
Eh bien, il pourrait être si vous connaissez le nombre exact de lignes de chaque fichier, et vous ne voulez pas utiliser -je, mais c'est beaucoup plus d'efforts que ce que vous avez actuellement. Alternativement, vous pouvez simplement utiliser awk.
Eh bien, si sed n'est pas une option, alors peut-être awk serait (selon la complexité de la commande). S'il vous plaît ajouter une réponse (à l'aide de awk) ci-dessous afin de prendre un coup d'oeil.
OriginalL'auteur mYself | 2015-08-26
Vous devez vous connecter pour publier un commentaire.
De le faire avec sed demande un peu plus d'shell supercherie. En supposant que bash, vous pouvez utiliser
Où
<(sed '16,80!d' file1)
est remplacé par le nom d'une pipe de sortie desed '16,80!d' file1
peut être lu.En général, j'ai l'impression que c'est plus agréable de le faire avec awk (si un peu plus de temps), parce que awk est mieux équipé pour gérer plusieurs fichiers d'entrée. Par exemple:
Cela fonctionne comme suit:
Cependant, cette approche ne se prête pas à l'édition de fichiers. Ce n'est généralement pas un problème, je serais tout simplement utiliser
avec l'avantage supplémentaire d'avoir une sauvegarde au cas où les choses tournent mal, mais en fin de compte, il est à vous.
sed
etawk
juste sorties tout à stdout, plutôt que d'enregistrer les modifications dans un fichier. Merci de modifier votre réponse à la refléter. Btw., êtes-vous la même personne que @User112638726 je parlais d'avant?Ah, j'ai lu à droite sur l'édition à la partie. La réponse est mise à jour. Ce serait techniquement possible, avec GNU awk 4.1 ou une version ultérieure, afin d'adapter la awk approche de l'édition, mais comme il y a plusieurs fichiers d'entrée, dont l'un doit être changé, je ne pense pas que c'est une très bonne idée, vous devez écraser un fichier avec son propre contenu, et qui laisse une possibilité que les choses aillent plus mal si quelque chose a été bafoué. Et non, je ne suis pas User112638726.
C'est un des aspects de la question, mais quel est le problème avec la modification sur place avec awk qui n'est pas un problème avec sed? Selon question,
gawk
peut le faire (c'est à dire qu'il a la même-i
option sed). Aussi, merci pour les précisions au sujet de votre identité. J'ai été un peu confus ce que vous avez répondu à la question juste après, il/elle a proposé.gawk pouvez modifier en place, mais si vous donnez plusieurs fichiers d'entrée, il va modifier tous en place. Vous pourriez remplacer le premier fichier d'entrée avec les données que vous avez fait dans le premier lieu, et si quelque chose va mal, qui vont quitter le fichier inchangé, sauf pour l'horodatage, mais dans mon esprit, cela est laid, car il est plus enclin à l'erreur que de ne jamais toucher le fichier dans la première place.
Juste pour clarifier les choses, je vais utiliser ces commandes comme "un ensemble de patchs, je peux publier au lieu de travailler directement à partir de la Borne d'apporter des modifications lorsque je peux utiliser une interface graphique. Donc, je ne se soucient de vous assurer qu'ils sont courts et simples, et aussi facile à comprendre.
OriginalL'auteur Wintermute
J'ai fait quelque chose de similaire à l'aide de:
Consultez la documentation de votre local versions de tête et queue, et changer les deux nombres entiers fonction de vos besoins.
OriginalL'auteur Arif Burhan
sed -i "1,16 d
$(( 16 + 18 )) r patch
81,$ d" YourFile
mais ajouter un peu de sécurité sur la ligne de compte dans ce cas.
r
ligne est de plus de 1 ligne, la ligne suivante sont toujours comptés à partir de lieu d'origine et le fichier final est plus grand que 80 - 16 lignesje n'ai pas exactement de test pour ligne prise,exclues ou modifiées (comme 34 est la 18ème ligne de rognée fichier),mais le principe est le même
Explication pour les Lignes d'index des références utilisées dans cet exemple:
1,15
sont l'en-tête de la ligne à supprimer, donc le fichier de prendre soin de lignes de 16 dans ce cas34
est la ligne à modifier le contenu est le résultat de la 18ème ligne APRÈS la première du nouveau contenu (ligne 16 dans notre cas) donc 16 + 18 = 3481,$
sont de fuite des lignes à supprimer,$
dire la dernière ligne et 81 est la première ligne (après 80 qui est pris) les bruits de fuite des lignes.-e
place de nouvelles lignes, de sorte qu'il ne prendra qu'une seule ligne au lieu de trois.qui OS, fonctionnent très bien sur mon linux et sur AIX (pas l'-je) ? vous avez peut-être besoin d'un argument après
-i
comme sur MAC. Je viens d'adapter le numéro de la ligne (16 -> 15, vous demandez-vous à prendre de la ligne 16, inclus)Salut à nouveau. J'ai essayé de nouveau à l'aide de la modification proposée avec les mêmes résultats. Ma distribution est Trisquel 7.0 (Ubuntu 14.04). C'est exactement la commande que j'ai utilisé:
sed -i -e $((1847+1663))r../VirtualBox-4.1.40/Config.kmk -e 1,1662d -e '1681,$d' Config.kmk
. Les fichiers peuvent être obtenus ici: download.virtualbox.org/virtualbox/5.0.2/.... Ce que je fais mal?Voici le lien vers l'autre fichier j'ai oublié: download.virtualbox.org/virtualbox/4.1.40/.... La commande doit être exécutée dans
VirtualBox-5.0.2
dossier.désolé, impossible de télécharger des fichiers à partir d'ici pour le test. la lecture du numéro de ligne à partir de votre commande, il semble y avoir un problème. vous supprimez les lignes de 1681 jusqu'à la fin, mais avant, vous modifiez la ligne 3510 (votre
r
). Cela n'aura jamais d'inclure votre fichier où doitOriginalL'auteur NeronLeVelu
j'ai eu ce problème, je l'ai fait en 2 étapes(1-queue 2-tête), par exemple dans un fichier texte avec 20 lignes(test.txt), nous voulons copier les lignes de 13 à 17 dans un autre fichier(final.txt),
queue -8 test.txt > temp.txt
tête -5 temp.txt > final.txt
OriginalL'auteur Farshad Falaki