0

何らかの理由で、文字列内のスラッシュをエスケープする必要があります

# echo "http://google.com" | sed -e 's/[/]/\\\//g'
http:\/\/google.com

しかし、 `` 内で同じことを実行しようとすると、次のように表示されます。

# somevar=`echo "http://google.com" | sed -e 's/[/]/\\\//g'`
sed: -e expression #1, char 10: unknown option to `s'

私のsedのバージョン:

# rpm -q sed
sed-4.1.5-8.el5
4

3 に答える 3

1

これは、コマンドが解析される前に、バッククォート (別名バッククォート、グレイブ アクセント) の内側\\が置き換えられるためです。\

bashマンページから:

古いスタイルの逆引用符形式の置換が使用される場合、バックスラッシュは、$、`、または \ が続く場合を除いて、その文字どおりの意味を保持します。バックスラッシュが前にない最初の逆引用符は、コマンド置換を終了します。$(command) 形式を使用する場合、括弧内のすべての文字がコマンドを構成します。特別に扱われることはありません。

pre-posix との互換性$(...)が本当に必要でない限り、バッククォートの代わりに使用してくださいsh

somevar=$(echo "http://google.com" | sed -e 's/[/]/\\\//g')

/これを簡単にする以外に、正規表現区切り文字を使用することもお勧めします。

somevar=$(echo "http://google.com" | sed -e 's|/|\\/|g')
于 2012-04-09T13:26:59.150 に答える
0

もう一度文字列をエスケープする必要があります。

$ echo `echo \x`  # tilde is executing "echo x"
x
$ echo `echo \\x`   # tilde is executing "echo \x"
x
$ echo `echo \\\x`   # tilde is executing "echo \\x"
\x

あなたの場合、2つの余分なスラッシュを追加する必要があります

$ echo `echo "http://google.com" | sed -e 's/[/]/\\\\\//g'`
http:\/\/google.com
于 2012-04-09T13:33:44.723 に答える
0

別の区切り文字を使用すると問題ありません。コマンド ラインから機能する理由はわかりませんが、どこでも機能するように修正してください。

somevar=`echo "http://google.com" | sed -e 's%[/]%\\/%g'`
于 2012-04-09T13:27:31.053 に答える