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 25/08/2012, à 11:02

A.

[résolu] Trouver et remplacer une ligne dans un fichier

Bonjour,

Je cherche à faire un script qui viendrait remplacer une ligne par une autre dans un fichier.
Je n'y connais pas grand chose, mais j'ai pu trouver quelques infos qui m'ont permis d'avancer.
Il reste un dernier problème que je n'ai pas encore résolu (proprement).

Extrait du fichier :

[Containments][1][Wallpaper][image]
slideTimer=10
slidepaths=/usr/share/wallpapers/
userswallpapers=...
wallpaper=/home/user/Images/image1.jpg
wallpapercolor=0,0,0
wallpaperposition=1

J'aimerais remplacer mon fond (Image1) par une autre, aléatoirement.
Un morceau de code me permet d'avoir "/home/user/Images/ImageAléatoire.jpg".
Il me reste juste à remplacer l'ancien chemin par le nouveau. La fonction sed semble pouvoir m'aider, mais le fichier image étant aléatoire je ne sais pas comment le remplacer.

Si vous avez une piste à me proposer,
Merci.

Dernière modification par A. (Le 25/08/2012, à 13:00)

Hors ligne

#2 Le 25/08/2012, à 11:36

Compte anonymisé

Re : [résolu] Trouver et remplacer une ligne dans un fichier

Mais, que voit-on dans le sujet "À lire avant de poster" de "Trucs, astuces et scripts utiles" ?

nesthib a écrit :

Afin de maintenir le forum « Trucs, astuces et scripts utiles » agréable et le plus utile possible, merci de respecter les points suivants :

Ne pas poster de demandes d'aide dans cette section. De très nombreuses catégories de support sont disponibles (voir la liste complète en page d'accueil).
Les demandes d'aide seront systématiquement déplacées.

#3 Le 25/08/2012, à 11:57

badentriya

Re : [résolu] Trouver et remplacer une ligne dans un fichier

titou345 a écrit :

Mais, que voit-on dans le sujet "À lire avant de poster" de "Trucs, astuces et scripts utiles" ?

nesthib a écrit :

Afin de maintenir le forum « Trucs, astuces et scripts utiles » agréable et le plus utile possible, merci de respecter les points suivants :

Ne pas poster de demandes d'aide dans cette section. De très nombreuses catégories de support sont disponibles (voir la liste complète en page d'accueil).
Les demandes d'aide seront systématiquement déplacées.

L'amabilité naturelle des personnes fréquentant ce forum me surprendra toujours...

Sinon, pour répondre à la question, le plus facile, à ma connaissance, est de remplacer la ligne entière par une nouvelle expression. Il faut d'abord traiter l'addresse de la nouvelle image de telle sorte que les "/" soient protégés, sinon sed ne va pas être content :

$ image=/home/moi/image.jpg
$ image="$(sed 's/\//\\\//g' <<< $image)"
$ echo $image
   \/home\/moi\/image.jpg

Et ensuite on modifie le fichier :

$ sed -i "s/^wallpaper=.*$/wallpaper=$image/" fichier
   [Containments][1][Wallpaper][image]
   slideTimer=10
   slidepaths=/usr/share/wallpapers/
   userswallpapers=...
   wallpaper=/home/moi/image.jpg
   wallpapercolor=0,0,0
   wallpaperposition=1

Cela modifie directement le fichier, alors faites-en une copie avant d'essayer.

Sinon, selon l'environnement de bureau que vous utilisez, il y a des solutions plus pratiques pour changer automatiquement de fond d'écran, et vous devriez commencer par chercher de ce côté.

Hors ligne

#4 Le 25/08/2012, à 12:06

Bousky

Re : [résolu] Trouver et remplacer une ligne dans un fichier

On peut utiliser autre-chose que « / » dans sed, donc pas besoin d'échapper le nom de fichier.

sed -i "s|^wallpaper=.*$|wallpaper=$image|" fichier

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

#5 Le 25/08/2012, à 12:07

pingouinux

Re : [résolu] Trouver et remplacer une ligne dans un fichier

Bonjour,

badentriya #3 a écrit :

Il faut d'abord traiter l'addresse de la nouvelle image de telle sorte que les "/" soient protégés, sinon sed ne va pas être content

Pour info, ce n'est pas nécessaire, on peut utiliser un autre caractère comme séparateur.
Exemples :

$ sed 's#a/b#A/B#' <<<"/aaa/bbb/ccc"
/aaA/Bbb/ccc

$ sed 's@a/b@A/B@' <<<"/aaa/bbb/ccc"
/aaA/Bbb/ccc

$ sed 's=a/b=A/B=' <<<"/aaa/bbb/ccc"
/aaA/Bbb/ccc

Édité : Bousky, tu es trop rapide…

Dernière modification par pingouinux (Le 25/08/2012, à 12:10)

Hors ligne

#6 Le 25/08/2012, à 12:30

Compte anonymisé

Re : [résolu] Trouver et remplacer une ligne dans un fichier

badentriya a écrit :
titou345 a écrit :

Mais, que voit-on dans le sujet "À lire avant de poster" de "Trucs, astuces et scripts utiles" ?

nesthib a écrit :

Afin de maintenir le forum « Trucs, astuces et scripts utiles » agréable et le plus utile possible, merci de respecter les points suivants :

Ne pas poster de demandes d'aide dans cette section. De très nombreuses catégories de support sont disponibles (voir la liste complète en page d'accueil).
Les demandes d'aide seront systématiquement déplacées.

L'amabilité naturelle des personnes fréquentant ce forum me surprendra toujours...

Quand des règles sont mises en places elles sont faites pour être respectées. Il n'y en a que peu ici donc les respecter est à la fois facile et juste respectueux en fait. Pour les gens qui respectent ce genre de règles je suis tout à fait aimable. Merci de t'en soucier.

#7 Le 25/08/2012, à 12:54

A.

Re : [résolu] Trouver et remplacer une ligne dans un fichier

C'est parfait, merci beaucoup.

L'idée était effectivement de remplacer la ligne entière, mais il me manquait l'étoile pour sélectionner la partie aléatoire.
J'utilise kubuntu mais je n'ai rien vu de simple juste pour sélectionner le fond aléatoirement.
Comme il suffit de remplacer une ligne dans un fichier et que j'avais déjà une base que j'utilise sous Crunchbang, j'ai pensé au script qui me semblait simple à mettre en place.

Finalement, ça donne ceci (en tenant compte des différentes remarques) :

#!/bin/bash

Dir="/home/user/Images/"

if [ ! -d "$Dir" ]; then
  echo "Not Exist $Dir"
  exit 1
fi

SetBG () {
while IFS= read -rd '' file; do list+=("$file"); done < <(find "$Dir" -iname "*.jpg" ! -type d -print0)
TotalFiles=${#list[@]}
RandomNumber=$(( $RANDOM % $TotalFiles ))
test ! $RandomNumber = 0 || RandomNumber=1

RandomFile="${list[RandomNumber]}"
sed -i "s|^wallpaper=.*$|wallpaper=$RandomFile|" /home/user/plasma-desktop-appletsrc #fichier de test
}

SetBG
sleep

Désolé pour la mauvaise section.
A ma décharge, c'est ici que j'avais eu la meilleure aide la dernière fois, ce qui m'a fait revenir.
Je tacherai d'aller dans la bonne section à l'avenir.

Dernière modification par A. (Le 25/08/2012, à 13:46)

Hors ligne

#8 Le 25/08/2012, à 13:07

ljere

Re : [résolu] Trouver et remplacer une ligne dans un fichier

modération: aucun souci je l'ai déplacé, il suffit de "Signaler aux modérateurs" quand ce genre de chose arrive au lieu de sortir le sujet des "Discussions sans réponse" wink


ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon

Hors ligne

#9 Le 25/08/2012, à 14:02

pingouinux

Re : [résolu] Trouver et remplacer une ligne dans un fichier

@A. #7 : Suggestions

  • Tu peux éventuellement simplifier en utilisant la commande shuf (voir le man) :

    while.....
    RandomFile=$(shuf -e "${list[@]}" | head -1)
    sed.....
  • Pourquoi excluais-tu RandomNumber = 0 ?

  • Peut-être qu'il est possible aussi de ne modifier le fichier qu'une seule fois (pas testé) :

    wallpaper=/home/user/Images/lien_vers_image

    et une fois que tu as fait le tirage aléatoire dans ton script :

    ln -sf "$RandomFile" "$Dir"/lien_vers_image

Hors ligne

#10 Le 25/08/2012, à 14:44

Compte anonymisé

Re : [résolu] Trouver et remplacer une ligne dans un fichier

A. a écrit :

Désolé pour la mauvaise section.
A ma décharge, c'est ici que j'avais eu la meilleure aide la dernière fois, ce qui m'a fait revenir.
Je tacherai d'aller dans la bonne section à l'avenir.

Pas de souci, ma remarque n'était même pas méchante, juste informative.

#11 Le 25/08/2012, à 16:38

A.

Re : [résolu] Trouver et remplacer une ligne dans un fichier

pingouinux a écrit :
  • Pourquoi excluais-tu RandomNumber = 0 ?

  • Peut-être qu'il est possible aussi de ne modifier le fichier qu'une seule fois (pas testé) :

    wallpaper=/home/user/Images/lien_vers_image

    et une fois que tu as fait le tirage aléatoire dans ton script :

    ln -sf "$RandomFile" "$Dir"/lien_vers_image

Aucune idée pour le cas nul, ça fait parti du code original. J'avais juste modifié le script initial pour qu'il fonctionne avec nitrogen et pour filtrer les images au format jpg.
Mais si je supprime cette ligne je ne remarque rien d'anormal.

En passant par un lien_vers_image, ça fonctionne aussi.

Du coup, la fonction SetBG() peut se raccourcir :

SetBG () {
while IFS= read -rd '' file; do list+=("$file"); done < <(find "$Dir" -iname "*.jpg" ! -type d -print0)
TotalFiles=${#list[@]}
RandomFile=$(shuf -e "${list[@]}" | head -1)
ln -sf "$RandomFile" "$Dir"/lien_vers_image
}

Merci.

Hors ligne