sed를 사용하여 이스케이프 문자 제거

sed를 사용하여 이스케이프 문자 제거

내 입력은 특수 이스케이프 문자가 포함된 파이프에서 나옵니다. 설명을 위해 흐름은 다음과 같습니다.

printf "foo.bar\033[00m" > file
cat file

후행을 제거하는 방법은 무엇입니까 .bar\033[00m? 다음을 시도했지만 작동하지 않습니다.

cat file | sed 's/\.bar\033[00m//'

답변1

파일에 다음과 같은 제어 문자가 포함되어 있는 경우

printf "foo.bar\033[00m" > file

그런 다음 특정 단일 발생을 제거하려면 .bar\033[00m다음을 작성하십시오.

sed $'s/\.bar\033\[00m//'

전체 파일에서 모든 이스케이프 시퀀스를 제거하려면 다음을 수행하십시오.

sed $'s/\033\[[0-9;]*m//g'

작은따옴표로 묶인 문자열 앞의 달러( )는 $'some text'쉘이 문자열 내용에 ANSI C 인용을 적용하도록 지시합니다 printf. 이는 "이스케이프된" ASCII 문자( 0x1B/ /...)를 생성하는 033데 필요합니다 .

캐릭터는 키보드 단축키를 통해 생성될 수도 있습니다( $'필수는 아님):

sed 's/\.barCtrl-vESC\[00m//'

타격 후 화면에 표시 Ctrl-vESC되어야 하는데 텍스트 와 (2자) 대신 제어 문자가 있습니다.^[^[


원래 답변

원하는 경우 foo출력

printf '%s' 'foo.bar\033[00m' | sed 's/\.bar\\033\[00m//'

\와 는 모두 [상대방에 의해 이스케이프되어야 합니다 \. 또한 입력 문자를 이스케이프 코드와 ANSI 색상으로 해석될 수 있는 리터럴 문자열로 인쇄 '%s'하기 위해 추가했습니다 .printf\033[

답변2

[백슬래시 이스케이프 및 문자를 사용해야 합니다 .\

printf '%s' "foo.bar\033[00m" | sed 's/\.bar\\033\[00m//'

또는 문자열에서 점 문자 뒤의 모든 내용을 제거하려면 다음을 수행하십시오.

printf "foo.bar\033[00m" | sed 's/\..*//'

관련 정보