색상으로 출력을 생성하는 스크립트가 있으며 ANSI 코드를 제거해야합니다.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
출력은 (로그 파일)입니다 :
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
나는 ESC 캐릭터를 여기에 넣는 방법을 몰랐다 @
.
스크립트를 다음과 같이 변경했습니다.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
그러나 이제 나에게 (로그 파일로) 제공합니다.
java (pid 12321) is running...@[60G[ OK ]
이걸 어떻게 제거 할 수 @[60G
있습니까?
전체 스크립트의 색상을 완전히 비활성화하는 방법이 있습니까?
답변
위키 백과에 따르면 의 [m|K]
에서 sed
사용중인 명령은 특별히 처리 할 수 있도록 설계되어있다 m
(색상 명령)과 K
(이하 “라인의 삭제 부분”명령). 스크립트가 절대 커서 위치를 60 ( ^[[60G
) 으로 설정 하여 한 줄의 모든 OK를 얻지 sed
못합니다.
( 파이프 문자와 일치하지 않기 때문에 [m|K]
아마도 (m|K)
또는 [mK]
일 것입니다 . 그러나 지금은 중요하지 않습니다.)
명령에서 해당 최종 일치를 [mGK]
또는 (m|G|K)
로 전환하면 해당 추가 제어 시퀀스를 잡을 수 있습니다.
./somescript | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g"
답변
다른 답변에서 괜찮은 결과를 얻을 수 없었지만 다음이 저에게 효과적이었습니다.
somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g"
제어 문자 “^ [“만 제거하면 나머지 색상 데이터 (예 : “33m”)가 남았습니다. 색상 코드와 “m”을 포함하여 트릭을 수행했습니다. \ x1B [31m은 확실히 echo와 함께 작동하기 때문에 s / \ x1B // g가 작동하지 않습니다.
답변
IMHO, 이러한 답변의 대부분은 이스케이프 코드 내부의 내용을 제한하기 위해 너무 열심히 노력합니다. 결과적으로 [38;5;60m
(256 색상 모드의 전경 ANSI 색상 60) 과 같은 공통 코드가 누락 됩니다.
또한 GNU 확장-r
을 가능하게 하는 옵션이 필요합니다 . 이것들은 필요하지 않습니다. 그들은 정규식을 더 잘 읽습니다.
다음은 256 색 이스케이프를 처리하고 GNU가 아닌 시스템에서 작동하는 간단한 답변입니다 sed
.
./somescript | sed 's/\x1B\[[0-9;]\+[A-Za-z]//g'
이것은로 시작하고 [
, 소수와 세미콜론을 포함하며, 문자로 끝나는 모든 것을 잡을 것입니다 . 이것은 일반적인 ANSI 이스케이프 시퀀스 중 하나를 잡아야합니다 .
재미를 위해, 모든 가능한 ANSI 이스케이프 시퀀스에 대한 더 크고 일반적인 (그러나 최소한의 테스트) 솔루션이 있습니다 .
./somescript | sed 's/\x1B[@A-Z\\\]^_]\|\x1B\[[0-9:;<=>?]*[-!"#$%&'"'"'()*+,.\/]*[][\\@A-Z^_`a-z{|}~]//g'
(그리고 @ edi9999의 SI 문제 | sed "s/\x0f//g"
가있는 경우 끝에 추가 하십시오. 원치 않는 문자의 16 진수 로 바꾸면 모든 제어 문자에서 작동합니다 0f
)
답변
Mac OSX 또는 BSD 사용
./somescript | sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g'
답변
또한 때때로 SI 캐릭터가 등장한다는 문제가있었습니다.
예를 들어이 입력으로 발생했습니다. echo "$(tput setaf 1)foo$(tput sgr0) bar"
다음은 SI 문자를 제거하는 방법입니다 (shift in) (0x0f).
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g"
답변
흠, 이것이 당신에게 효과가 있는지 확실하지 않지만 ‘tr’은 제어 코드를 ‘제거'(삭제) 합니다.
./somescript | tr -d '[:cntrl:]'
답변
나는 비슷한 문제가 있었다. 내가 찾은 모든 솔루션은 색상 코드에서 잘 작동했지만 추가 된 문자는 제거하지 않았습니다 "$(tput sgr0)"
(속성 재설정).
예를 들어, davemyron 의 주석 에서 해결책 을 취 하면 아래 예제의 결과 문자열 길이는 6이 아니라 9입니다.
#!/usr/bin/env bash
string="$(tput setaf 9)foobar$(tput sgr0)"
string_sed="$( sed -r "s/\x1B\[[0-9;]*[JKmsu]//g" <<< "${string}" )"
echo ${#string_sed}
제대로 작동하려면 정규식을 sgr0
( ” \E(B
“)로 추가 된 순서와 일치하도록 확장해야합니다 .
string_sed="$( sed -r "s/\x1B(\[[0-9;]*[JKmsu]|\(B)//g" <<< "${string}" )"