颜色线,但不显示匹配的图案

颜色线,但不显示匹配的图案

所以我有这样的文字:

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

嗯,你应该:

  1. 匹配包含搜索字符串的行/UNIVERSE/
  2. 去除不必要的部分
  3. 替换开头(^)${boldred}
  4. 用以下方式替换 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属性应用于整行。我过去常常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}/"

相关内容