2015-02-18 4 views
8

Chcę zastąpić #Banner none z Banner /etc/sshd_banner, który jest w zakresie /etc/sshd_config. Jeśli uruchomięCo jest nie tak z podstawieniem ciągu znaków za pomocą sed na Mac OS X?

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

otrzymuję następujący błąd

SED: 1: "/ etc/sshd_config": niezakończony substytut wzór

Wszelkie pomysły, jak rozwiązać ten problem?

+1

Dodaj wyrażenie kończące/do zastępczego. Ala 's/# Banner none/Banner \/etc \/sshd_banner /" ' –

+0

To nie działa. – Technic1an

+1

? Znaczenie...? Zastąpienie nie zadziałało, lub komunikat o błędzie nie zniknął? Jedną z fajnych rzeczy dotyczących sed jest to, że/jest tylko konwencją dla ogranicznika. Wypróbuj 'sed 's | #Banner none | Banner/etc/sshd_banner |" infile', aby uprościć czytelność. –

Odpowiedz

12

Spróbuj tego:

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

Poprzez zmianę separatora, nie trzeba się uciec /

Twój oryginalny post brakowało jednego / na końcu.

Od OS X instrukcji

-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 = ""

+1

Jak zauważył Jubobs, musi to być 'sed -i .bak ...' -i wymagające rozszerzenia do użycia dla pliku kopii zapasowej. –

9

Trzy problemy z poleceniem:

  1. Brakuje kończącego /.
  2. Nie można jednak użyć ogranicznika /, ponieważ ten znak występuje w łańcuchu, który próbujesz zastąpić/podstawić. Powinieneś użyć innego znaku, na przykład znaku potoku, jako ogranicznika.
  3. W wersji (BSD) z sed, że statki z Mac OS X, flaga -i oczekuje obowiązkowego<extension> argument, którego brakuje Twojego polecenia. Pusty ciąg ("") powinien być zgodny z flagą -i, jeśli chcesz edytować plik na miejscu przy użyciu tej wersji sed.

Podsumowując, spróbuj

sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config 
+6

część 3 tej odpowiedzi była bardzo pomocna, nie mogłem znaleźć tej informacji w innym miejscu podczas googlowania - wersja sed OSa to maj 2005 Wersja BSD, składnia jest inna w tym przypadku od GNU sed – bobo

0

Spróbuj apostrofów. Ponadto, niektóre Sed wymagają, aby uniknąć pierwszego pierwszego separatora, jeśli chcesz użyć czegoś innego niż /.

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

Jeszcze jedna rzecz jest taka, że ​​# jest ewentualnie być interpretowane jako komentarz, co dzieje się aż do końca linii.