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 16/08/2008, à 14:17

nochka85

[Résolu] Bash : Remplacer la première occurence dans un fichier

Bonjour,

j'ai un petit soucis en bash hmm

J'ai, par exemple, un fichier texte (essai.txt) qui contient ceci :

ABC
DEF
ABC

et je souhaiterais modifier ce contenu pour obtenir ceci :

GHI
DEF
ABC

... en gros, je voudrais remplacer la première occurence (et seulement celle-ci) de ABC par GHI tongue

J'utilise donc la commande perl suivante (mais si vous me trouvez une commande sed, cela m'ira aussi wink ) :

perl -i -p -e 's|ABC|GHI|' "essai.txt"

... mais il me modifie TOUTES les occurences ABC ! sad ... et j'obtiens donc :

GHI
DEF
GHI

... Pourtant, je croyais que pour changer toutes les occurences il fallait utiliser l'option /g  ( perl -i -p -e 's|ABC|GHI|g' "essai.txt" ) ???

Bref, je nage complètement hmm

Dernière modification par nochka85 (Le 16/08/2008, à 16:51)


Carte mère Asus P7P55D-E; Processeur Intel core i5 760; 8Go RAM PC3-10666; Geforce GTX 460 1024Mo sous Ubuntu 64bits 14.04
Eeepc 701 4G sous Linux Mint 10 Lxde
Site officiel de Glx-Dock/Cairo-Dock : http://www.glx-dock.org/
Dnd2share Unity - Partager vos images sur le forum par drag'n drop

Hors ligne

#2 Le 16/08/2008, à 14:23

abetsic

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Bonjour,

l'option "g" va permette de modifier toutes les occurences sur la ligne, tes occurences sont sur des lignes différentes, elles sont donc toutes les deux remplacées.

Pour ton problème je récupérerai d'abord le n° de ligne de la première occurence avec grep -n -m 1 (-n affiche le n° de ligne, -m 1 s'arrête après la première occurence)
Puis tu utilises sed avec le numéro de ligne que tu as récupéré pour faire ton remplacement. Je n'ai plus la syntaxe exacte à utiliser avec sed pour préciser la ligne sur laquelle on veut faire le remplacement, mais une petite recherche google t'aidera, sed étant extrèmement bien documenté

Hors ligne

#3 Le 16/08/2008, à 14:26

nochka85

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

merci pour ta préponse ! big_smile

Je vais donc "investiguer" de ce coté ...

Bien sûr, si quelqu'un à un bout de code à me donner, je suis preneur lol;)


Carte mère Asus P7P55D-E; Processeur Intel core i5 760; 8Go RAM PC3-10666; Geforce GTX 460 1024Mo sous Ubuntu 64bits 14.04
Eeepc 701 4G sous Linux Mint 10 Lxde
Site officiel de Glx-Dock/Cairo-Dock : http://www.glx-dock.org/
Dnd2share Unity - Partager vos images sur le forum par drag'n drop

Hors ligne

#4 Le 16/08/2008, à 14:52

claudius01

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Bonjour,

Si le caractère '~' n'est pas présent dans le fichier (sinon choisir un autre caractère), je te propose :

$ cat essai.txt | tr '\n' '~' | sed 's/ABC/GHI/' | tr '~' '\n'

qui consiste à mettre le fichier sur une seule ligne, à remplacer la 1ère occurence par 'sed' et à rétablir le '\n'
cf. le man de 'tr' qui permet de remplacer tout caractère par un autre...


Cordialement, A+
--
Claudius

Hors ligne

#5 Le 16/08/2008, à 15:02

claudius01

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Re,

Après un test concluant, choisir à la place de '~' (pouvant être présent dans le fichier), le caractère '\0' (null) qui, lui, ne peut pas être présent dans ton fichier, et donc je te propose :

$ cat essai.txt | tr '\n' '\0' | sed 's/ABC/GHI/' | tr '\0' '\n'

qui fonctionne à tous les coups cool


Cordialement, A+
--
Claudius

Hors ligne

#6 Le 16/08/2008, à 15:07

nochka85

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Astucieux, merci wink

Sinon, avec la première solution, j'ai réussi en faisant çà :

LIGNE=`cat essai.txt | grep "ABC" -n -m 1`
NB_LIGNE="`echo $LIGNE | cut -f1 -d ':' `"  # Numéro ligne seule
sed -i ""$NB_LIGNE"s|ABC|GHI|" "essai.txt"

Dernière modification par nochka85 (Le 16/08/2008, à 15:07)


Carte mère Asus P7P55D-E; Processeur Intel core i5 760; 8Go RAM PC3-10666; Geforce GTX 460 1024Mo sous Ubuntu 64bits 14.04
Eeepc 701 4G sous Linux Mint 10 Lxde
Site officiel de Glx-Dock/Cairo-Dock : http://www.glx-dock.org/
Dnd2share Unity - Partager vos images sur le forum par drag'n drop

Hors ligne

#7 Le 16/08/2008, à 15:26

Alain.g

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Une solution avec sed :

sed -i '0,/ABC/s//GHI/' essai.txt

Xubuntu Karmic !

Hors ligne

#8 Le 16/08/2008, à 15:37

frafa

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Gree
il m'enerve Alain.g smile
a chaque fois gue je cherche il trouve avant moi!

Hors ligne

#9 Le 16/08/2008, à 16:50

nochka85

Re : [Résolu] Bash : Remplacer la première occurence dans un fichier

Bon, et bien merci à tous !! wink


Carte mère Asus P7P55D-E; Processeur Intel core i5 760; 8Go RAM PC3-10666; Geforce GTX 460 1024Mo sous Ubuntu 64bits 14.04
Eeepc 701 4G sous Linux Mint 10 Lxde
Site officiel de Glx-Dock/Cairo-Dock : http://www.glx-dock.org/
Dnd2share Unity - Partager vos images sur le forum par drag'n drop

Hors ligne