以下のように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
今、これはまだ正しいではないようです。実際にやるべきことは、各行が青で始まるように設定し、次に各2
代替項目が赤で始まり、青で終わるように設定することです。帽子文字は^
行の始まりを表す正規表現です。また、パイプの使用と再配置に注意してくださいcat
。
$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"
サブシェル変換を変数割り当てに移動して、より明確にすることもできます。存在しない変数を使用しないように文字と区別するRED
ために中括弧が必要です。2
RED2
$ 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
。