2

unix シェル (bash) で sed を使用して、文字列内のセミコロン (';') をエスケープ ('\') しようとしています。変数に値を割り当てずに直接実行すると機能します。あれは、

$ echo "hello;" | sed 's/\([^\\]\);/\1\\;/g'
hello\;
$

ただし、上記のコマンドが変数に割り当てられている場合は機能しないようです。

$ result=`echo "hello;" | sed 's/\([^\\]\);/\1\\;/g'`
$ 
$ echo $result
hello; 
$

理由はありますか?

引用符の有無にかかわらず値を使用してみましたが、役に立ちませんでした。手がかりは大歓迎です。

ところで、私は最初、文字列の末尾にあるセミコロンが何らかの形でターミネーターとして機能していると考えたため、シェルはsed(それが意味をなす場合) を実行し続けませんでした。ただし、それは問題ではないようです。文字列の最後ではなく(その間のどこかで)セミコロンを使用してみました。以前と同じ結果が表示されます。あれは、

$ echo "hel;lo" | sed 's/\([^\\]\);/\1\\;/g'
hel\;lo
$
$ result=`echo "hel;lo" | sed 's/\([^\\]\);/\1\\;/g'`
$
$ echo $result
hel;lo
$
4

3 に答える 3

1

4 つ使用する必要があります (3 つも使用できます)。変数の内容を読み取るときに、最初はコマンドによって、2 つ目はシェルによって 2 回解釈されるためだと思います。

result=`echo "hello;" | sed 's/\([^\\]\);/\1\\\\;/g'`

echo "$result"

収量:

hello\;
于 2013-08-16T12:54:41.703 に答える