Próbuję użyć
sed -i -e "s/.*seb.*/ \"$ftp_login_template\"/" $ftp_dir
jednak otrzymuję ten błąd:
sed: -e expression #1, char 34: unknown option to `s'
Nie rozumiem, dlaczego to działa idealnie:
sed -i -e "s/.*wbspassword.*/ \"wbspassword\": \"$password\",/" $user_conf
Jakieś pomysły, co robię źle?
Czy to może być problem?
ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"
Odpowiedzi:
Problem jest z ukośnikami: twoja zmienna je zawiera, a ostatecznym poleceniem będzie coś w rodzaju
sed "s/string/path/to/something/g"
, zawierające zbyt wiele ukośników.Ponieważ
sed
może przyjąć dowolny znak jako separator (bez konieczności deklarowania nowego separatora), możesz spróbować użyć innego, który nie pojawia się w zastępującym ciągu:Zauważ, że to nie jest punkt kulminacyjny: jeśli zastępujący łańcuch później
@
będzie zawierał , zepsuje się z tego samego powodu, a wszelkie sekwencje odwrotnego ukośnika, takie jak,\1
będą nadal interpretowane zgodnie zsed
regułami. Używanie|
jako separatora jest również miłą opcją, ponieważ jest podobne w czytelności do/
.źródło
g
)."
'
$content
$content
sed -i "s/../../g"
innym znakiem, tj .:sed -i "s@...@...@g"
, wtedy problem wielu ukośników powinien zniknąć. A jeśli używasz"
zamiast tego'
, powinno również działać dobrze ze zmiennymi wewnątrz, tjexport var1=bar; sed -i "s@foo@${var1}@g"
. : . Więcej informacji można znaleźć w niesamowitej dokumentacji sedainfo sed
(źródło: unix.stackexchange.com/questions/259083/… ): "Składnia polecenia s (jak w zastępstwie) to 's / regexp / replace / flags'. Znaki / mogą być jednolicie zastąpione przez dowolne inne pojedynczy znak w ramach dowolnego polecenia s. "