색상 선이 있지만 일치하는 패턴이 표시되지 않음

색상 선이 있지만 일치하는 패턴이 표시되지 않음

그래서 다음과 같은 텍스트가 있습니다.

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속성이 전체 줄에 적용됩니다. 저는 터미널 유형(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}/"

관련 정보