Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/08/2011, à 10:13

Miroslav

Substituer les X premières lignes d'un texte par X d'un autre

Bonjour,

j'aimerais substituer les X premières lignes d'un texte par les X première d'un autre. Pour l'instant j'ai une méthode qui consiste à supprimer les X premières, copier le texte restant à la suite d'un fichier contenant le texte à ajouter avec la redirection >>, ensuite je renomme le fichier avec le nom du premier. C'est pas top non?

d'avance merci

Dernière modification par Miroslav (Le 22/08/2011, à 10:14)

Hors ligne

#2 Le 22/08/2011, à 11:51

nobody201

Re : Substituer les X premières lignes d'un texte par X d'un autre

Salut Miroslav,
ce n'est pas mon domaine d'expertise mais en premier lieu je me tournerai vers Sed:

http://www.siteduzero.com/tutoriel-3-28 … e-sed.html
En espérant que cela puisse t'aider,


The bird of Hermes is my name,
eating my wings to make me tame.

Hors ligne

#3 Le 22/08/2011, à 11:56

Bousky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Je vois mal sed utiliser deux fichiers différents en entrée, à moins de les concaténer, ce qui ici est à éviter…


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#4 Le 22/08/2011, à 11:57

Shrat

Re : Substituer les X premières lignes d'un texte par X d'un autre

awk "NR<3 {print $LINE} NR>2 {print \"youpi\"}" fichieramodifier

Hors ligne

#5 Le 22/08/2011, à 11:58

Shrat

Re : Substituer les X premières lignes d'un texte par X d'un autre

Ou plutôt :
awk "NR<3 {print \"youpiyoupi\"} NR>2 {print $LINE}" fichieramodifier

Hors ligne

#6 Le 22/08/2011, à 12:43

Miroslav

Re : Substituer les X premières lignes d'un texte par X d'un autre

Merci pour ces suggestions, je vais m'orienter sur le site du zéro pour voir si je ne peux pas revoir un peux ma copie. Merci Shrat pour la commande awk, mais ça a l'air un peu trop technique pour moi, j'ai vraimlent du mal à décrypter smile

Hors ligne

#7 Le 22/08/2011, à 14:19

Shrat

Re : Substituer les X premières lignes d'un texte par X d'un autre

C'est un peu barbare mais le man est très bien foutu. Je pense qu'apprendre awk est vraiment un investissement payant. Ceci dit, tu dois pouvoir t'en sortir à moindre frais avec sed.

Hors ligne

#8 Le 22/08/2011, à 15:05

AnsuzPeorth

Re : Substituer les X premières lignes d'un texte par X d'un autre

Bjr,
En full-bash cela aurait été facilement faisable, et de plus un bon exercise smile (certes, plus long ...)

Sinon, voilà une solution ...

debut=$(head -n 10 '/home/data2' | xargs -I% echo %\\)
sed -i "1,10d;11 i ${debut} " '/home/data1'

Comme tjrs, il y a d'autres solutions ...

Dernière modification par AnsuzPeorth (Le 22/08/2011, à 15:08)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 22/08/2011, à 15:47

aduxas

Re : Substituer les X premières lignes d'un texte par X d'un autre

(head -n 10 autre;sed '1,10d' texte) > tmp
mv tmp texte

Hors ligne

#10 Le 22/08/2011, à 17:21

Watael

Re : Substituer les X premières lignes d'un texte par X d'un autre

salut,

pourquoi sed , et pas tail ?

(nl=10; head -n $nl autre; tail -n +$((nl+1)) texte) > tmp
mv tmp texte

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 22/08/2011, à 17:51

aduxas

Re : Substituer les X premières lignes d'un texte par X d'un autre

Watael a écrit :

pourquoi sed , et pas tail ?

Parce que je n'avais pas pensé a l'option +N!

Hors ligne

#12 Le 22/08/2011, à 19:58

ehmicky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Salut,
Autre solution possible et simple avec seulement sed (avec X représentant ton "X") :

sed -i~ "1,$X {R $FILE2 
D}" "$FILE1"

dans un script, et comme cela :

sed -i~ -e "1,$X R $FILE2" -e "1,$X D" $FILE1

en console.
(Crée un backup via -i~)

Dernière modification par ehmicky (Le 22/08/2011, à 20:10)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#13 Le 22/08/2011, à 20:04

Bousky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Normalement la commande n'est pas validée tant que les guillemets ne sont pas refermés. Avec un « \ », le saut de ligne sera simplement ignoré… De plus il n'est (à ma connaissance) pas possible d'éditer la première ligne une fois sur la deuxième.


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#14 Le 22/08/2011, à 20:13

ehmicky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Désolé, je viens d'éditer mon post, mais effectivement, comme tu le dis, tout cela est inutile, il suffit de taper entrer vu que des doubles guillemets sont ouvertes smile

Dernière modification par ehmicky (Le 22/08/2011, à 20:43)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#15 Le 22/08/2011, à 21:48

Bousky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Ça marche pas simplement avec un « ; » à la place du saut de ligne ?


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#16 Le 23/08/2011, à 08:40

ehmicky

Re : Substituer les X premières lignes d'un texte par X d'un autre

Non


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#17 Le 23/08/2011, à 11:10

Miroslav

Re : Substituer les X premières lignes d'un texte par X d'un autre

merci ehmicky, je vais essayer de décrypter la commande avec le manuel  smile

Hors ligne

#18 Le 23/08/2011, à 19:32

ehmicky

Re : Substituer les X premières lignes d'un texte par X d'un autre

1,$X { } : exécute les commande suivantes entre la ligne 1 et ligne $X
R $FILE2 : écrit une ligne de $FILE2 après le pattern spance (= la ligne de $FILE1 actuellement lue)
D : supprime le pattern space (= cette même ligne ; il ne reste donc plus que la ligne de $FILE2)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#19 Le 23/08/2011, à 19:45

aduxas

Re : Substituer les X premières lignes d'un texte par X d'un autre

ehmicky a écrit :

D : supprime le pattern space (= cette même ligne ; il ne reste donc plus que la ligne de $FILE2)

Um, c'est un peu plus compliqué:

sed manual a écrit :

D
If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.

Contrairement à la commande R, la commande r ne passe pas par la pattern space.  La commande d efface toute la pattern space, la commande D n'en efface que la premiere ligne.  C'est pour cette raison que la ligne de FILE1 disparait et celle de FILE2 reste.

Hors ligne

#20 Le 26/08/2011, à 17:23

sputnick

Re : Substituer les X premières lignes d'un texte par X d'un autre

Watael a écrit :

salut,

pourquoi sed , et pas tail ?

(nl=10; head -n $nl autre; tail -n +$((nl+1)) texte) > tmp
mv tmp texte

Je plussoie sur cette solution claire et simple, sauf pour l'utilisation du sous shell : ()

{
    nl=10
    head -n $nl autre
    tail -n +$((nl+1)) texte
} > tmp_file
mv tmp_file texte

Ou bien une autre solution avec sed :

nl=10; sed -n "1,$nl{p}" fichier; sed -n "$((nl-1)),\$p" autre_fichier > new_fichier

Dernière modification par sputnick (Le 26/08/2011, à 17:34)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne