web-dev-qa-db-fra.com

Quel est le problème avec ma substitution de chaîne en utilisant sed sur Mac OS X?

Je veux remplacer #Banner none par Banner /etc/sshd_banner qui se trouve dans /etc/sshd_config. Si je cours

Sudo sed -i "s/#Banner none/Banner \/etc\/sshd_banner" /etc/sshd_config

Je reçois l'erreur suivante

sed: 1: "/ etc/sshd_config": modèle de remplacement non terminé

Des idées sur la façon de résoudre ce problème?

13
Technic1an

Essaye ça:

Sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config

En changeant le délimiteur, vous n'avez pas besoin d'échapper au /

Votre message original a manqué un / à la fin.

À partir du manuel OS X

-i extension
         Edit files in-place, saving backups with the specified extension.  If a zero-length extension
         is given, no backup will be saved.  It is not recommended to give a zero-length extension when
         in-place editing files, as you risk corruption or partial content in situations where disk
         space is exhausted, etc.

zero-length = ""

21
Jotne

Trois problèmes avec votre commande:

  1. Vous manquez le / final.
  2. De toute façon, vous ne pouvez pas utiliser / comme délimiteur, car ce caractère apparaît dans la chaîne que vous essayez de remplacer/substituer. Vous devez utiliser un caractère différent, tel qu'un caractère de canal, comme délimiteur.
  3. Dans la version (BSD) de sed fournie avec Mac OS X, l'indicateur -i s'attend à un argument required <extension>, ce que votre commande manque. Une chaîne vide ("") doit suivre l'indicateur -i si vous souhaitez modifier le fichier sur place avec cette version de sed.

En résumé, essayez

Sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config
18
jubobs

Essayez des guillemets simples. De plus, certains Seds exigent que vous vous échappiez du premier délimiteur si vous voulez utiliser autre chose que /.

Sudo sed -i 's\:#Banner none:Banner :etc/sshd_banner:' /etc/sshd_config

Une autre chose est que # est peut-être interprété comme un commentaire qui se poursuit jusqu'à la fin de la ligne.

0
Fernando Basso