sed: 특수 색상 문자와 일치

sed: 특수 색상 문자와 일치

특수 색상으로 구분된 문자가 포함된 파일이 있습니다.

$ cat zz
aaa.gpg
bbb.gpg
ccc.gpg

$ cat -A zz
^[[38;5;216maaa.gpg^[[00m$
^[[38;5;216mbbb.gpg^[[00m$
^[[38;5;216mccc.gpg^[[00m$

sed결말을 일치시키고 .gpg제거하려면 명령을 사용해야합니다 . 따라서 특수 문자가 없으면 다음을 사용합니다.

cat zz | sed 's/\.gpg$//'

그러면 어떻게 .gpg^[[00m$패턴을 일치시킬 수 있나요 sed?

가능한 모든 순열을 시도했지만 여전히 작동하지 않습니다. 예를 들어:

cat zz | sed 's/\.gpg\^\[\[00m$//'

답변1

c=$(printf '\\(\33\\[[0-9;]*m\\)*')

$csgr (그래픽 렌더링 설정).

그 다음에:

sed "s/${c}\.${c}g${c}p${c}g\(${c}\)\$/\5/"

.gpg산재된 선행 SGR 시퀀스를 포함하는 꼬리는 제거되지만 꼬리 시퀀스(예: \e[00m기본 그래픽 변환을 복원하기 위한 (sgr0))는 유지됩니다.

답변2

Ansi 시퀀스(색상 및 이동)를 제거하기 위해 다음 줄을 따라 실행할 수 있습니다.

perl -pe 's/\e\[[0-9;]*[mGKHF]//g'

그 이후에는 상황이 더 명확해졌습니다.

답변3

터미널에 표시되는 것은 ^[이스케이프 문자입니다. 두 번째 [는 하나입니다 [.

이스케이프 코드를 포함해야 합니다.

^[이스케이프 문자로 대체됩니다 .

esc="$(echo '\033')"
sed 's/\.gpg'"${esc}"'\[00m$//'

또는

esc='\x1b`
...

답변4

나는 당신이 이스케이프 시퀀스를 그대로 두길 원한다고 가정합니다(이미 존재하는 경우). 다음을 수행할 수 있습니다.

sed -E 's/\.gpg([[:cntrl:]]|$)/\1/' zz

.gpg이는 다음 항목 과 일치합니다 .누구나줄 끝또는모든 제어 문자(예: ESC 문자) 제어 문자가 일치하면 교체 시 제어 문자가 유지됩니다 \1.

이스케이프 시퀀스가 ​​없으면 .gpg줄 끝도 제거됩니다.

관련 정보