Perl式を使用した条件付き色の指定

Perl式を使用した条件付き色の指定

perl2つのコマンドとテストファイルがありますtest.txt

$ cat test.txt
aaa bla
bbb foo
#ccc bar
ddd 444

最初の式はまたは赤perlで表示されます。aaabbb

cat test.txt | perl -pe "s/(aaa|bbb)/\e[1;31m\1\033[0m/g"

2番目の式は、次に始まるすべての行に色を割り当てます#

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m\1\033[0m/g"

次に、次の属性を使用してこれら2つの式を1つにまとめる必要があります。

行がで始まる場合、行#全体が緑色で表示されます。行が#赤で表示されない場合、またはaaabbbで始まらない場合。

つまり、線がすでに緑色の場合(一般的な注釈線など)、表示できるaaa色を指定したくありませんbbb。そうでなければ、赤で染めたいです。

これを達成するために、2つの式をどのように組み合わせることができますか?

ベストアンサー1

最も簡単な方法は次のとおりです。

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m\1\033[0m/g || s/(aaa|bbb)/\e[1;31m\1\033[0m/g"

これは、論理OR演算子を使用して、最初のジョブが失敗した場合にのみ2番目のジョブを実行するように||Perlに指示します。s///つまり、次のようなものif (/#/) ... else if (/aaa|bbb/) ...

|| s///必要に応じてスクリプトの最後に追加できますが、検索と色が必要な場合たくさんゲームが多くなるとラインにすると複雑すぎます。この場合は、スクリプト全体を最後の行ではなくセミコロンを使用して、1行#! /usr/bin/perl -pに1つずつ別々のスクリプトとして書き直してください。s///g ||||

たとえば、

#! /usr/bin/perl -p

s/^(#.*)/\e[0;32m\1\033[0m/g ||
s/(aaa|bbb)/\e[1;31m\1\033[0m/g || 
s/(ccc)/\e[1;34m\1\033[0m/g ;

これは、与えられた行に1つの一致のみを見つけることができ、最初の一致が勝つという意味です。したがって、上記の長いスクリプト例では、「aaa」または「bbb」が1行にある場合は色が割り当てられますが、「ccc」が行にある場合同じライン、いいえ。

最後に、ホイールを再発明するようです。テキストの色を指定するためのいくつかのツールがすでに存在しています。これ強調するたとえば、ツールです。主にソースコードの構文を強調するために使用されますが、任意の種類のテキストに色を付けるためにも使用できます。

おすすめ記事