perl
2つのコマンドとテストファイルがありますtest.txt
。
$ cat test.txt
aaa bla
bbb foo
#ccc bar
ddd 444
最初の式はまたは赤perl
で表示されます。aaa
bbb
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つにまとめる必要があります。
行がで始まる場合、行#
全体が緑色で表示されます。行が#
赤で表示されない場合、またはaaa
赤bbb
で始まらない場合。
つまり、線がすでに緑色の場合(一般的な注釈線など)、表示できる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」が行にある場合同じライン、いいえ。
最後に、ホイールを再発明するようです。テキストの色を指定するためのいくつかのツールがすでに存在しています。これ強調するたとえば、ツールです。主にソースコードの構文を強調するために使用されますが、任意の種類のテキストに色を付けるためにも使用できます。