그래서 다음과 같은 텍스트가 있습니다.
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}/"