#1 Le 05/07/2008, à 17:59
- nochka85
[Résolu] Script bash:Remplacer une ligne dans un fichier texte
Bonjour,
J'ai un petit soucis en bash :
J'ai un fichier de config dans lequel je souhaiterais remplacer une ligne (ou une partie de la ligne) grâce à un script en bash...
J'arrive sans problème à trouver et extraire ma ligne avec :
cat $CURRENT_THEME$CONFIGURATION_FILE | grep "default icon directory="
... où $CURRENT_THEME$CONFIGURATION_FILE = Mon fichier de config
et donc, cette commande me renvoit ceci :
default icon directory=/home/mon_user/mon_theme1
Bref, je voudrais que mon script puisse écrire dans le fichier et remplacer /home/mon_user/mon_theme1 par (par exemple) /home/mon_user/theme/mon_theme2
.... et là, je coince complètement
Dernière modification par nochka85 (Le 06/07/2008, à 12:20)
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 05/07/2008, à 18:23
- Totor
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
sed est très bien pour cela :
sed -i 's/\(default icon directory=\).*'/\1Ce que tu souhaites mettre à la place/' $CURRENT_THEME$CONFIGURATION_FILE
l'option -i te permet d'effectuer la modification directement dans le fichier.
Dernière modification par Totor (Le 05/07/2008, à 19:25)
-- Lucid Lynx --
Hors ligne
#3 Le 06/07/2008, à 09:09
- nochka85
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Merci bien -> Je teste çà tout de suite
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 06/07/2008, à 10:19
- nochka85
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Bon, y'a un soucis .... Quand je fais çà :
sed -i 's/\(default icon directory=\).*'/\1Ce que tu souhaites mettre à la place/' $CURRENT_THEME$CONFIGURATION_FILE
j'obtiens cette erreur :
sed: -e expression n°1, caractère 35: commande `s' inachevée
Et puis une petite question : comment je peux remplacer les 2 textes par des variables prédéfinies ? .... en gros, je voudrais faire un truc du genre :
sed -i 's/\($TEXTE1\).*'/\$TEXTE2/' $CURRENT_THEME$CONFIGURATION_FILE
ou TEXTE1="default icon directory=" ... et TEXTE2="default icon directory=mon_répertoire"
Dernière modification par nochka85 (Le 06/07/2008, à 10:28)
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
#5 Le 06/07/2008, à 11:22
- RG
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Bonjour,
je te propose le shell script bash suivant :
#!/bin/bash
# Auteur : R. Griesner
# Licence: GPL (of course !)
#_______________________
#
# verifcation du nombre d'argument
#
if [ $# -ne 2 ]
then
echo "?? usage : $0 <fichier a traiter> <nouveau texte>" >&2
exit 1
fi
#
# affectation des variables de position a des
# variables avec un nom plus significatif
#
FICHIER=$1
NEW_TEXT=$2
#
# lecture du fichier a traiter
#
while read LIGNE
do
#
# si la ligne courante contient default icon directory=
#
if echo $LIGNE | grep 'default icon directory=' 1>/dev/null
then
SAVEIFS=$IFS; IFS="=" # sauve et modif de IFS
#
# traiter la ligne
#
set $LIGNE # eclater la ligne par rapport a IFS
AVANT=$1 # recuperer ce qui est avant le =
APRES=$2 # recuperer ce qui est apres le =
echo "$AVANT=$NEW_TEXT" # reconstruire le ligne et l'afficher
export IFS=$SAVEIFS # restaure IFS
else
echo $LIGNE # afficher la ligne inchangee
fi
done < $FICHIER
#
# BYE
#
exit 0
A sauver dans un fichier, par exemple my_sed, puis :
$ chmod 700 my_sed # pour le rendre executable
$ ./my_sed $CURRENT_THEME$CONFIGURATION_FILE "nouveau_texte"
le fichier d'origine reste inchangé et le résultat s'affiche à l'ècran. Il suffit de rediriger le résultat dans un fichier.
bonne chance,
RG
#6 Le 06/07/2008, à 12:19
- nochka85
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Merci .... mais je viens de trouver mieux :
perl -i -p -e 's|default icon directory=.*|default icon directory='$NOUVELLE_ADRESSE'|g' "$CURRENT_THEME$CONFIGURATION_FILE"
:cool:
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 06/07/2008, à 12:49
- Totor
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Bon, y'a un soucis
.... Quand je fais çà :
sed -i 's/\(default icon directory=\).*'/\1Ce que tu souhaites mettre à la place/' $CURRENT_THEME$CONFIGURATION_FILE
j'obtiens cette erreur :
sed: -e expression n°1, caractère 35: commande `s' inachevée
effectivement, il y a une quote en trop après l'*. Cela donne :
sed -i 's/\(default icon directory=\).*/\1Ce que tu souhaites mettre à la place/' $CURRENT_THEME$CONFIGURATION_FILE
Et puis une petite question : comment je peux remplacer les 2 textes par des variables prédéfinies ? .... en gros, je voudrais faire un truc du genre :
sed -i 's/\($TEXTE1\).*'/\$TEXTE2/' $CURRENT_THEME$CONFIGURATION_FILE
ou TEXTE1="default icon directory=" ... et TEXTE2="default icon directory=mon_répertoire"
oui, c'est à peu près ça. Bufferiser TEXTE1 devient inutile car il est inclu dans TEXTE2. Cela donne :
TEXTE1="default icon directory="
TEXTE2="${TEXTE1}mon_répertoire"
sed -i 's/${TEXTE1}.*/${TEXTE2}/' ${CURRENT_THEME}${CONFIGURATION_FILE}
Notes :
- je te conseille de mettre tes noms de variables entre {}.
- dans ta solution, le g est inutile car normalement, tu n'as qu'une occurence de ton texte par ligne.
Dernière modification par Totor (Le 06/07/2008, à 12:50)
-- Lucid Lynx --
Hors ligne
#8 Le 06/07/2008, à 13:27
- nochka85
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
Merci pour toutes ces précisions :)
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
#9 Le 09/07/2008, à 23:57
- erlik
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
sed -i 's/${TEXTE1}.*/${TEXTE2}/' ${CURRENT_THEME}${CONFIGURATION_FILE}
Je viens d'essayer sed avec des variables, mais etrangement , ça ne marche pas ...
$ TEST="test"
$ echo $TEST | sed 's/${TEST}/modifie/'
test
EDIT:
a bah en fait, il faut utiliser des guillemets et non, des apostrophes......... et j'ai remarqué le separateur '/' a tendance a renvoyer des erreurs du style "sed: -e expression n°1, caractère 10: option inconnue pour `s` ", en sh en tt cas. Donc la meilleurs mise en forme que j'ai trouvé est
$ echo $TEST | sed "s|$TEST|modifie|"
modifie
Dernière modification par erlik (Le 10/07/2008, à 00:19)
Je ne suis pas un geek! Je suis un être humain!
Hors ligne
#10 Le 06/03/2017, à 16:31
- kholo
Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte
comme je passais par là, pour faire avancer, j'ai repris le script de RG
#!/bin/bash
# ----------------------------------------------
FONCTION="remplace une occurrence par une autre dans un fichier texte
?? usage : $0 <fichier a traiter> <RECHERCHE> <nouveau texte> <SEPARATEUR>
on doit pouvoir trouver tout ce qui se compose en
ARGUMENT SEPARATOR VALEUR
unArgument=une valeur
unArgument= une valeur
unArgument:une valeur
unArgument: une valeur
...
NB : la suppression de l'original est commenté dans cette version
"
#_______________________
# NOTES DE VERSIONS
VERSION="alpha"
# Auteur : R. Griesner
# Licence: GPL (of course !)
# modifié par kholo (cyril Ury)
#_______________________
#
# vérification du nombre d'argument
#
if [ $# -ne 2 ]
then
echo "$FONCTION" >&2
# #POUR TESTS
exit 1
# #"letest=xxx en 14"
# set "fichierTest.txt" "letest" "14" "="
# #ou
# #Cinnamon: [32-bit] > [64-bit]
# set "fichierTest.txt" "Cinnamon" "[64-bit]" ": "
fi
#
# affectation des variables de position a des
# variables avec un nom plus significatif
#
FICHIER="$1"
RECHERCHE="$2"
NEW_TEXT="$3"
SEPARATEUR="$4"
fichierTemp="${FICHIER}_temp"
if [ -e "${fichierTemp}" ]; then
rm "${fichierTemp}"
fi
touch "${fichierTemp}"
#
# lecture du fichier a traiter
#
function ecrireLigne {
# écrire ligne dans fichier temp
echo -e "$@" | tee -a "${fichierTemp}"
}
while read LIGNE
do
#
# si la ligne courante contient $RECHERCHE
#
if echo -e "${LIGNE}" | grep "${RECHERCHE}${SEPARATEUR}" 1>/dev/null
then
#
# traiter la ligne
#
SAVEIFS=$IFS; IFS="${SEPARATEUR}" # sauve et modif de IFS
set $LIGNE # eclater la ligne par rapport a IFS
AVANT=$1 # recuperer ce qui est avant le =
APRES=$2 # recuperer ce qui est apres le =
ecrireLigne "${AVANT}${SEPARATEUR}${NEW_TEXT}" # reconstruire le ligne et l'afficher
export IFS=$SAVEIFS # restaure IFS
else
ecrireLigne "${LIGNE}" # afficher la ligne inchangee
fi
done < "$FICHIER"
# #supprimer original
# rm "${fichier}"
# #déplacer nouveau
# mv "${fichierTemp}" "${fichier}"
exit 0
Hors ligne