Traitement par ligne en Bash

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

afin d’utiliser une fonction de favoris dans Surf, il se trouve que j’ai actuellement ceci dans la config :

1
2
3
4
5
#define BM_ADD { .v = (char *[]){ "/bin/sh", "-c", \
    "(echo `xprop -id $0 _SURF_URI | cut -d '\"' -f 2` && "\
    "cat ~/.surf/bookmarks) | awk '!seen[$0]++' > ~/.surf/bookmarks_new && "\
    "mv ~/.surf/bookmarks_new ~/.surf/bookmarks", \
    winid, NULL } }

J’aimerais changer un peu la commande Bash pour que, si il trouve la ligne, il la supprime, plutôt que de simplement l’ignorer.

Je peux également faire une autre fonction (#define BM_DEL {…}) que je peux assigner à un autre raccourci, ce qui est plus intéressant, afin d’éviter la suppression par mégarde d’un favoris.

Je ne pense pas que ça soit réellement complexe, mais je galère un peu…

Merci d’avance, Breizh.

Édité par Breizh

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0

Salut,

J’avoue que je ne vois pas très bien qu’elle est l’entrée au départ ni ce que tu veux obtenir. Peux-tu détailler un peu ces deux points ?

Édité par Taurre

+0 -0
Auteur du sujet

En gros, lors de la pression sur la touche assignée, ce code est exécuté. Ce code ajoute l’URL actuelle (echo `xprop -id $0 _SURF_URI | cut -d '\"' -f 2`) à celles déjà dans le fichier (cat ~/.surf/bookmarks) uniquement si elle n’y est pas déjà (awk '!seen[$0]++'). Ensuite, ça mets le résultat dans un fichier temporaire qui va remplacer le premier fichier cité.

Ce que j’aimerais, c’est un code similaire qui supprime l’URL actuelle si elle est présente dans le fichier.

Édité par Breizh

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0

A priori, c’est faisable avec un petit script de ce genre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /bin/sh -e

LIST=ton/fichier/contenant/la/liste
NEW=$(xprop -id "$0" _SURF_URI | cut -d '\"' -f 2)

if ! grep "${NEW}" "${LIST}"; then
    echo "${NEW}" >>"${LIST}"
fi

exit 0

Édité par Taurre

+0 -0
Auteur du sujet

J’avoue ne pas avoir testé, mais à première vue, ce script fait ce que je fait déjà : ajouter une URL au fichier si elle n’y est pas déjà. Sauf que moi, je cherche un script qui supprime cette URL si elle est déjà présente dans le fichier.

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0

En complétant le script avec un else + sed ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /bin/sh -e

LIST=ton/fichier/contenant/la/liste
NEW=$(xprop -id "$0" _SURF_URI | cut -d '\"' -f 2)

if ! grep "${NEW}" "${LIST}"; then
   echo "${NEW}" >>"${LIST}"
else
   sed -i "/${NEW}/d" ${LIST}
fi 
exit 0

Édité par Gwend@l

+0 -0
Auteur du sujet

Le problème, c’est que c’est une URL. Avec des / partout, et une commande sed qui marchait en terminal (sed "\,$URL,d" ~/.surf/bookmarks) ne fonctionnait pas dans ce cas… Je cherche du côté de awk.

Édité par Breizh

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0
Auteur du sujet

Non, je n’avais pas mis -i, je retente en le mettant. Par contre, c’est pas un script. C’est dans un en-tête C, si ça se trouve j’avais mal échappé des caractères ou un truc comme ça.

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0
Auteur du sujet

Pour l’instant, j’ai ça :

1
2
3
4
#define BM_DEL { .v = (char *[]){ "/bin/sh", "-c", \
    "sed -i \"\,$(xprop -id $0 _SURF_URI | cut -d '\"' -f 2),d\" ~/.surf/bookmarks > ~/.surf/bookmarks_new && "\
    "mv ~/.surf/bookmarks_new ~/.surf/bookmarks", \
    winid, NULL } }

Cependant, ça ne fonctionne pas. J’ai le message sed: -e expression n°1, caractère 1: commande inconnue: `,'.

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0

Cette réponse a aidé l’auteur du sujet

Avec l’option -i (alias de --in-place), plus besoin de

1
2
           (Blabla)              > ~/.surf/bookmarks_new && "\
    "mv ~/.surf/bookmarks_new ~/.surf/bookmarks", \

Mais sinon ca devrait marcher…

Sinon, autre solution en utilisant grep :

1
2
3
4
#define BM_DEL { .v = (char *[]){ "/bin/sh", "-c", \
    "grep -v \"$(xprop -id $0 _SURF_URI | cut -d '\"' -f 2)\" ~/.surf/bookmarks > ~/.surf/bookmarks_new && "\
    "mv ~/.surf/bookmarks_new ~/.surf/bookmarks", \
    winid, NULL } }

Édité par Gwend@l

+0 -0
Auteur du sujet

Bon, le sed marche toujours pas. Par contre, le grep fonctionne parfaitement, merci :) .

Breizh eo ma bro, hag ihuel eo ma c’halon geti. Da viken. — L’oiseau imaginaire : ZzxŷxzZ

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte