내 입력은 특수 이스케이프 문자가 포함된 파이프에서 나옵니다. 설명을 위해 흐름은 다음과 같습니다.
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/\.bar
Ctrl-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/\..*//'