#1 Le 16/08/2008, à 13:17
- nochka85
[Résolu] Bash : Remplacer la première occurence dans un fichier
Bonjour,
j'ai un petit soucis en bash
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
J'utilise donc la commande perl suivante (mais si vous me trouvez une commande sed, cela m'ira aussi ) :
perl -i -p -e 's|ABC|GHI|' "essai.txt"
... mais il me modifie TOUTES les occurences ABC ! ... 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
Dernière modification par nochka85 (Le 16/08/2008, à 15: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, à 13: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, à 13:26
- nochka85
Re : [Résolu] Bash : Remplacer la première occurence dans un fichier
merci pour ta préponse !
Je vais donc "investiguer" de ce coté ...
Bien sûr, si quelqu'un à un bout de code à me donner, je suis preneur ;)
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, à 13: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, à 14: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
Cordialement, A+
--
Claudius
Hors ligne
#6 Le 16/08/2008, à 14:07
- nochka85
Re : [Résolu] Bash : Remplacer la première occurence dans un fichier
Astucieux, merci
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, à 14: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, à 14: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, à 14:37
- frafa
Re : [Résolu] Bash : Remplacer la première occurence dans un fichier
Gree
il m'enerve Alain.g
a chaque fois gue je cherche il trouve avant moi!
Hors ligne
#9 Le 16/08/2008, à 15:50
- nochka85
Re : [Résolu] Bash : Remplacer la première occurence dans un fichier
Bon, et bien merci à tous !!
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