sedが「 `s 'の不明なオプション」エラーで失敗する


158

使用しようとしています

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

しかし、私はこのエラーを受け取ります:

sed: -e expression #1, char 34: unknown option to `s'

これは完全に機能するので、なぜなのかわかりません。

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

私が間違っていることについてのアイデアはありますか?

これは問題でしょうか? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
* BSDエラーメッセージ(OSXを含む)は「代替コマンドの不正なフラグ:」です-これをここに含めると、これは多少わかりやすくなります。
tripleee、2015年

回答:


355

問題はスラッシュにあります:変数にはスラッシュが含まれており、最後のコマンドはのようになりsed "s/string/path/to/something/g"、スラッシュが多すぎます。

以来sed(新しい区切り文字を宣言しなくても)区切り文字として任意の文字を取ることができ、あなたの置換文字列に表示されていない別のものを使用して試すことができます。

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

これは完全な証拠ではないことに注意してください。置換文字列が後で含まれる@場合、同じ理由で文字列が壊れ、同様のバックスラッシュシーケンス\1sedルールに従って解釈されます。|区切り文字として使用することも、読みやすさの点でと似ているため、優れたオプションです/


38
この回答も参考にしたので、将来のユーザーを助けるためのメモです。元のポスターには、おそらくスラッシュが含まれている置換(おそらく変数に隠されている)に何かが含まれていました。これらのスラッシュの最初の1つが検出された後、sedは置換が終了したと見なし、オプションとして次に来るものはすべて(などg)でした。
ブライアンワーショー

4
"うまく'できています(そうでなければ、変数式をラップすることを忘れない$contentでください$content:) の内容ではなく、最終結果に多くの結果が得られます)

1
@AbstractDissonanceたぶん、パスワードや奇妙な、あるいはランダムなものを置き換えたとしても、@が残っているでしょう。置換文字列に含まれていない区切り文字を見つける必要があります。
Xavi Montero 2017

5
@ppumkinは、ie:などの「スラッシュ」区切り文字sed -i "s/../../g"を別の文字ie:sed -i "s@...@...@g"に置き換えるだけで、複数のスラッシュの問題が解消されます。"代わりに使用する場合は'、内部の変数でもうまく機能するはずです export var1=bar; sed -i "s@foo@${var1}@g"。sedのすばらしいドキュメントに詳しい情報があります:grymoire.com/Unix/Sed.html
Egel

1
info sed(ソース:unix.stackexchange.com/questions/259083/…)を参照してください:「s(代替として)コマンドの構文は 's / regexp / replacement / flags'です。特定のsコマンド内の単一の文字。」
ガブリエルステープルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.