6

OSX の場合:

bash-3.2$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc

一方、Linux では:

$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
azc

z は正しく赤く表示されます。

これは bash 3.2 の制限ですか? ここでの Linux テストでは、bash 4.1.2 が実行されます。

奇妙なことに、職場の Linux 環境では、bash のバージョンが 3.2 未満であり、そこでも動作します

また、これは関連している可能性がありますが、おそらくそうではありません。

bash-3.2$ echo "abc" | sed 's/b/^[[31mz^[[m/'
31mz$'m/'azc

繰り返しますが、BSD sed に固有です。それはかなり不可解です:何かがシェルを引き起こしているようですか、またはsed何らかの形でコマンドの壊れた部分を端末にエコーしているようですか? ただし、常にコマンドの正しい出力の前にあります。あのドル記号はどこから来たの?

(私のコマンドの色(>私のプロンプトである曲がっていないように見えるシアンのUnicode文字の後に来る)と混同しないでください、私はzshで構文の強調表示を使用します)

ここに画像の説明を入力

4

2 に答える 2

13

OS X のバージョンの sed は、求めているエスケープ置換を行いません。これを回避する$'...'には、文字列を sed に渡す前に bash に置換を行わせます。

$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc
$ echo "abc" | sed $'s/b/\x1b[31mz\x1b[m/'
azc

(2番目の「z」は赤であると信じてください。)ただし、場合によっては、sedにエスケープ置換を実行させたいものをダブルエスケープする必要があることに注意してください。

于 2013-06-09T23:43:18.357 に答える
2

おー。シェルのバージョンはこれに影響しません。なぜそう思ったのかわかりません。

原因は、BSD sed が変換を行わないことです。そのため、解決策はCtrl+V、sed コマンド文字列で生のエスケープ バイトを使用する方法です。

于 2013-06-09T23:23:04.133 に答える