Traitement par ligne en Bash

Le problème exposé dans ce sujet a été résolu.

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.

+0 -0

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.

+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
+0 -0

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.

+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
+0 -0

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: `,'.

+0 -0

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 } }
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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