개행 문자를 유지하면서 ^[[1m ^[[22m ^[[4m ^[[24m 문자를 제거하는 방법은 무엇입니까? [복사]

개행 문자를 유지하면서 ^[[1m ^[[22m ^[[4m ^[[24m 문자를 제거하는 방법은 무엇입니까? [복사]

입력하다:

[user@notebook test]$ cat a.txt

music
musicsheet
sheetmusic

[user@notebook test]$ cat a.txt | cat -vte -
$
^[[1mmusic^[[22m$
^[[1mmusicsheet^[[22m$
^[[1msheetmusic^[[22m$
^[[4m^[[24m$
[user@notebook test]$ 

원하는 출력(흥미로운 문자를 제거한 후):

[user@notebook test]$ cat a.txt 
music
musicsheet
sheetmusic
[user@notebook test]$ cat a.txt | cat -vte -
music$
musicsheet$
sheetmusic$
[user@notebook test]$ 

질문:흥미롭거나 알 수 없는 문자를 제거하는 방법:

^[[1m
^[[22m
^[[4m
^[[24m

이 캐릭터는 무엇입니까? 비슷한 것이 더 있을 수 있을까요?

인쇄할 수 없는 문자를 제거하기 위해 tr을 사용하려고 하면 흥미로운 문자만 표시되고 개행 문자가 제거됩니다. 둘 중 어느 것도 좋지 않습니다.

[user@notebook test]$ cat a.txt | tr -cd '[:print:]'
[1mmusic[22m[1mmusicsheet[22m[1msheetmusic[22m[4m[24m[user@notebook test]$ 

답변1

CSI... 시퀀스를 삭제하려고 합니다 m. 로 구분된 일련의 숫자가 포함되어 있다는 것을 알고 있으면 ;sed를 사용하여 각 항목을 빈 문자열로 바꿀 수 있습니다.

esc=$'\e'
sed "s/$esc\[[0-9;]*m//g" a.txt

위의 이스케이프 문자를 작성하기 위해 Bash 구문을 사용하고 있습니다.

답변2

@Toby Speight의 솔루션은 훌륭합니다. 추가 정보:

일반적으로 이는 터미널에서 색상, 특수 효과, 커서 위치 등을 생성하는 데 사용되는 ANSI "특수 문자"입니다.

예를 들어 grep --color=always '[a-z]*music[a-z]*' files > output이런 문자가 생성됩니다.

sed -r "s/\x1B\[[0-9;]*[a-zA-Z]//g"

GREP_COLOR제안: 더 이상 사용되지 않는 변수가 다음과 같이 설정 되어 있는지 확인하세요 --color=always.

관련 정보