sedを使用して尾の出力を塗りつぶす

sedを使用して尾の出力を塗りつぶす

tailwithの出力色をどのように指定しますかsed

echo "`tput setaf 1`foo`tput op`"期待どおりに動作

echo "foo" | sed -e 's/(foo)/`tput setaf 1`\0`tput op`/g'しかしそうではありません。

私がここで何を見逃しているのでしょうか?

答え1

必ずそうでしょうかsed

echo "foo bar baz" | grep --color=auto "bar"

上記の内容はbarデフォルトで赤で強調表示されます。マニュアルページには、環境変数で使用する色を選択できることが示されていますGREP_COLORS

すべての行を印刷して強調表示するには、次の手順を実行しますbar

echo "foo bar baz" | grep -E --color=auto "^|bar"

答え2

echoコマンドのバックティック ``はプロセスを生成し、その出力をechoコマンドラインに置き換えます。たとえば、次のように表示できます。

echo "`tput setaf 1`" | hexdump -C
00000000  1b 5b 33 31 6d 0a                       |.[31m.|

"..."これは、echoに転送される前にコンテンツが拡張されるために機能します。

使用するsedコマンドはすべてを包み込み、'拡張なしでsedに渡し、sedはそれらをすべてリテラルテキストとして扱います。

sedコマンドの周りに ""を追加すると、この問題を解決できます。

echo "foo" | sed -e "s/\(foo\)/`tput setaf 1`\1`tput op`/g"

sed コマンドにも問題があります。エスケープして記憶されたパターンで表現する必要があります(。私は私がいつも使った最初の暗記パターンを決して使用しませんでした。)\(\)\0\1

関連情報