web-dev-qa-db-fra.com

Comment supprimer une ligne du référentiel avec sed

Mon /etc/apt/sources.list contient cette ligne:

deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/ 

Je veux supprimer cette ligne via sed en ligne de commande, j'ai donc essayé ce code mais renvoie une erreur!

$ Sudo sed 's:deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/::g' /etc/apt/sources.list
sed: -e expression #1, char 75: unknown option to `s'

Je suppose que le symbole : après http a provoqué cette erreur, mais comment puis-je y remédier?

6
Ali Razmdideh

Vous pouvez utiliser n’importe quel symbole * pour délimiter les chaînes de recherche/remplacement qui n’entrent pas en conflit avec les symboles in les chaînes, tant que vous l’utilisez de manière cohérente, par exemple:

Sudo sed 's#deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/##g' /etc/apt/sources.list

Cela réduit le besoin d'échapper à un caractère problématique (ce qui pourrait être fait en utilisant \ comme échappement).

* Je suis sûr qu'il existe des exceptions, en particulier si vous utilisez des versions plus anciennes de sed, mais je n'ai pas connaissance de limitations.

9
user4556274

Courez comme ça:

Sudo sed -i '\%^deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb%d' /etc/apt/sources.list

Les problèmes que j'ai résolus:

  • Utilisez le drapeau -i pour modifier le fichier sur place. Sans cela, la commande imprimerait simplement le résultat de sed à l'écran, sans mettre à jour le fichier.
  • Au lieu d'utiliser s/// pour remplacer la ligne par une chaîne vide, j'ai utilisé la commande d pour supprimer la ligne.
  • Pour la correspondance de motif, au lieu de /.../, j’ai utilisé \%...%, car % n’apparaît pas dans le motif. Avec /, toutes les occurrences de / devraient être remplacées.

Notez qu'un filtre plus simple pourrait suffire. Par exemple, si vous savez que xenlist-wildfire est unique dans le fichier, cette commande plus simple fonctionnera également:

Sudo sed -i '/xenlism-wildfire/d' /etc/apt/sources.list

Comme dans cet exemple, il n'y a pas de /, je pourrais utiliser le filtre plus simple /.../.

(Merci pour @ steeldriver pour les idées d'amélioration.)

6
janos