1

次の簡単なコマンドを参照してください。

$ echo $tmp
UY\U[_
$ echo "a" | sed "s|a|${tmp}|g"
UY[_

\U食べられます。他の円記号も存続しません。

上記のコマンドを期待どおりに機能させるにはどうすればよいですか?

4

2 に答える 2

3

sedによって「食べられ」、それだけで十分にエスケープするのがバックスラッシュだけである場合は、次のことを試してください。

echo "a" | sed "s|a|${tmp//\\/\\\\}|g"

あなたにとって十分に混乱していますか?\\シェルでもエスケープする必要があるため、単一の\を表します。イニシャルはの修飾子に//似ています。最初に出現するパターンのみを置き換えたい場合は、スキップしてください。gs/foo/bar/g

に関するドキュメント${parameter/pattern/string}はここから入手できます:http ://www.gnu.org/s/bash/manual/bash.html#Shell-Parameter-Expansion

編集:やりたいことによっては、実際にはsedを使用しない方がよい場合があります。

$ tmp="UY\U[_"
$ in="a"
$ echo ${in//a/$tmp}
UY\U[_
于 2011-09-22T09:24:53.713 に答える
1

sedを介して$tmp自体を再解析できます

echo "a" | sed "s|a|$(echo ${tmp} | sed 's|\\|\\\\|g')|g"
于 2011-09-22T09:24:25.337 に答える