
특수 색상으로 구분된 문자가 포함된 파일이 있습니다.
$ 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\\)*')
$c
sgr (그래픽 렌더링 설정).
그 다음에:
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
줄 끝도 제거됩니다.