sed コマンドの変数にはエスケープシーケンスを使用できません。

sed コマンドの変数にはエスケープシーケンスを使用できません。

sedコマンド出力で列を強調表示するために使用し、psカラーコードをハードコーディングすると正しく機能します。ただし、色を動的に表現する必要があるため、変数に移動してsed命令でその変数を参照しようとしましたが、まったく動作しないようです。

# Works
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'

ただし、\033[1;33mおよびを\033[0m変数に移動してコマンドで参照すると(さまざまな方法)、まったく機能しません。

# None of the following work
fg_normal="\033[0m"
fg_yellow="\033[1;33m"

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /'$fg_yellow'&'$fg_normal'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $"s/ *[^ ]* /$fg_yellow&$fg_normal/6"

どんなアイデアがありますか?

答え1

あなたが使用できる:

fg_normal=$(echo -e "\033[0m")
fg_yellow=$(echo -e "\033[1;33m")

またはtputを使用してください:

fg_normal=$(tput sgr0)
fg_yellow=$(tput setaf 3)

答え2

printf%b指定子を使用して、正しいバックスラッシュエスケープシーケンスを維持しながらsedコマンドを組み合わせることができます。

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | 
    sed -e "$(printf 's/ *[^ ]* /%b&%b/6' "$fg_yellow" "$fg_normal")"

答え3

理解する必要があるシェルの機能の1つ$'...'は、エスケープ文字を作成することです。 A$'\033'は真の脱出だESC

$' 'そのため、sed コマンド内で移動する必要があります。

sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'

実際の変数の場合は、次を使用します。

fg_normal=$'\033[0m'
fg_yellow=$'\033[1;33m'

この単純な変更で($'今は不要です)動作します(一重引用符の内外の正しい引用を観察')。

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu |
head -n 10  |
sed -e 's/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'

関連情報