ファイルの特定の文字列に色を割り当てる方法

ファイルの特定の文字列に色を割り当てる方法

以下のようにHello.txtファイルを準備しました。

1253125213
213532135
23513125215

次に、「2」青と「2」赤を除くすべての行に色を付けたいと思います。

最初は文章を書いた。

BLUE='\033[0;34m'
RED='\033[0;31m'

そしてそうしようと努力しましたがsed 's/2/${RED}2${BLUE}/'、効果がありませんでした。

どうすればいいですか?

答え1

まず、補間するときに二重引用符が必要です。

$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215

ただし、ASCIIエスケープシーケンスにはsedに影響を与える文字が含まれているため、エスケープ文字シーケンスを実際の制御文字に変換する必要があります。これはサブシェルを使用して行うことができます。最後を参照してください/g。これは、1行に複数の置換が許可されることを意味します。

$ sed "s/2/`echo $RED`2`echo $BLUE`/g" Hello.txt

カラー出力1

今、これはまだ正しいではないようです。実際にやるべきことは、各行が青で始まるように設定し、次に各2代替項目が赤で始まり、青で終わるように設定することです。帽子文字は^行の始まりを表す正規表現です。また、パイプの使用と再配置に注意してくださいcat

$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"

カラー出力2

サブシェル変換を変数割り当てに移動して、より明確にすることもできます。存在しない変数を使用しないように文字と区別するREDために中括弧が必要です。2RED2

$ BLUE=`echo '\033[0;34m'`
$ RED=`echo '\033[0;31m'`
$ cat Hello.txt | sed "s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"

源泉:http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/

答え2

ZimbiXがすでに説明したように、二重引用符などを使用してください。

彼のアプローチの代替案は、$'…'エスケープシーケンスが解釈される構文を使用することです。つまり:

\e    => ASCII ESC (0x1b, 033)
\033  => ASCII ESC (0x1b, 033)
\x1b  => ASCII ESC (0x1b, 033)

だから:

red=$'\e[31m'
blue=$'\e[34m'

それから:

printf $blue && sed "s/2/${red}2$blue/g" Hello.txt

または必要に応じて、以下を含めてください。初期化変える:

cc=$'\e[0m'
printf $blue && sed "s/2/$cc${red}2$cc$blue/g" Hello.txt && printf $cc

コードを表示するには、次のように入力します。

(printf $blue && sed "s/2/${red}2$blue/g" Hello.txt) | cat -v

gまた、のグローバル使用に注意してくださいsed

関連情報