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 05/07/2008, à 18: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 wink

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 hmm

Dernière modification par nochka85 (Le 06/07/2008, à 13: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, à 19: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.

aide sur sed

Dernière modification par Totor (Le 05/07/2008, à 20:25)


-- Lucid Lynx --

Hors ligne

#3 Le 06/07/2008, à 10:09

nochka85

Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte

Merci bien -> Je teste çà tout de suite 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

#4 Le 06/07/2008, à 11:19

nochka85

Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte

Bon, y'a un soucis hmm .... 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, à 11: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, à 12: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, à 13: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: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, à 13:49

Totor

Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte

nochka85 a écrit :

Bon, y'a un soucis hmm .... 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
nochka85 a écrit :

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, à 13:50)


-- Lucid Lynx --

Hors ligne

#8 Le 06/07/2008, à 14:27

nochka85

Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte

Merci pour toutes ces précisions 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

#9 Le 10/07/2008, à 00:57

erlik

Re : [Résolu] Script bash:Remplacer une ligne dans un fichier texte

Totor a écrit :

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, à 01:19)


Je ne suis pas un geek! Je suis un être humain!

Hors ligne

#10 Le 06/03/2017, à 17: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