だから、次のテキストがあります。
2019/06/16 22:36:28 (UNIVERSE) * @{EE3F}Trytrytry sagt: @{F80F}going afk for a bit
たとえば、線全体を赤で染色したいとします。その後、不要な部分を取り除きます。
22:36:28 Trytrytry sagt: going afk for a bit
部品の取り外しはすでに機能しますが、追加すると次のことが行われます。
norm="$(printf '\033[0m')"
boldred="$(printf '\033[0;1;31m')"
sed -ue s/UNIVERSE/${boldred}&${norm}/g
UNIVERSEにのみ色を付けて表示しますが、表示したくありません。 UNIVERSEのあるライン全体を着色したいです。だから色を追加するだけです。それから私達はこう言うことができます:
IF(UNIVERSE)THEN端子の線を赤で塗りつぶしますが、きれいに保ち、削除した部分を表示しないでください。
どんなアイデアがありますか?
答え1
行を次のように変更してくださいsed
。
sed -ue 's/\(.*UNIVERSE.*\)/'${boldred}'\1'${norm}'/g'
を使用すると、.*UNIVERSE.*
その項目を含む行全体を一致させ、括弧を追加して一致UNIVERSE
項目\(.*UNIVERSE.*\)
(この場合は完全行)をキャプチャし、前の一致項目の逆参照を使用します\1
。
答え2
まあ、あなたはする必要があります:
- 検索文字列を含む行と一致します。
/UNIVERSE/
- 削除する不要な部分
(^)
次から始めて置き換える${boldred}
$
end( ) を次のように置き換えます。${norm}
以下は、公開された仕様に基づいたアプローチを示す一時的なスニペットです。
norm="$(printf '\033[0m')"; boldred="$(printf '\033[0;1;31m')"; sed -ure "/UNIVERSE/{s/^[^ ]* //;s/\(UNIVERSE[^}]+}//;s/sagt:[^}]+}/sagt: /;s/^/${boldred}/;s/$/${norm}/}" input1
または読みやすくするために分割します。
norm="$(printf '\033[0m')";
boldred="$(printf '\033[0;1;31m')";
sed -ure "/UNIVERSE/ {
s/^[^ ]* //;
s/\(UNIVERSE[^}]+}//;
s/sagt:[^}]+}/sagt: /;
s/^/${boldred}/;
s/$/${norm}/
}"
また、完全なスタンドアロンPerlソリューションも提供しました。
perl -pe 'BEGIN{use Term::ANSIColor qw(:constants)} if(/UNIVERSE/){s/^\S*\s//;s/\(UNIVERSE[^}]+}//;s/sagt:[^}]+}/sagt: /;$_=RED.$_.RESET}'
または読みやすくするために分割します。
perl -pe 'BEGIN {use Term::ANSIColor qw(:constants)}
if (/UNIVERSE/) {
s/^\S*\s//;
s/\(UNIVERSE[^}]+}//;
s/sagt:[^}]+}/sagt: /;
$_ = RED . $_ . RESET
}'
答え3
このコードスニペットの行がsed
一致するUNIVERSE
と、red
+bold
属性は行全体に適用されます。私は、端末タイプ(jobなどの設定されていない場所を含む)tput
に応じて調整される属性値を取得しようとしました。cron
# See "man 5 terminfo" for other portable settings
red=$(tput setaf 1 2>/dev/null)
bold=$(tput bold 2>/dev/null)
norm=$(tput sgr0 2>/dev/null)
# Perform the substitution
sed -e "/UNIVERSE/s/^.*$/${red}${bold}&${norm}/"