모든 인쇄 할 수없는 문자를 대체하는 Bash 명령?


1

데이터베이스 변경 사항을 확인하고 이러한 변경 사항을 전자 메일로 보내는 bash 스크립트가 있습니다. 인쇄가 불가능한 것을 보내려고 할 때까지 작동합니다. 메일을 '손상'시킵니다.

모든 인쇄 할 수없는 문자를 문자열의 16 진수 코드로 대체하는 편리한 방법이 있습니까? ( " abc & lt; 1A & gt; def & lt; 07 & gt; xyz ")?

내가 생각할 수있는 것은 모두의 sed 한 문자 씩 전달하는 명령. 어느 쪽이 옳지 않은지.

편집하다: 이 질문을 게시 한 후, 나는 cat -v 명령은 내가 원했던 것을 주로했다. 누군가가 더 좋은 점을 지적하지 않는 한 지금 이것을 사용하십시오.

답변:


3

다음과 같은 간단한 대체를 사용할 수 있습니다.

perl -pe 's/([^[:print:]\n])/sprintf("<%02X>", ord($1))/ge'

그만큼 less 명령은 사용자가 지정하는 것과 매우 유사한 출력 형식을 갖지만 문자 그대로 예제 문자 열에 제어 문자를 인쇄합니다. 아마 당신은 그것으로 더 운이있다 (나는 나의 시스템이 너무 현대적이라고 생각하고있다 :-). 출력이 터미널에 있지 않을 때 페이징을 수행해서는 안되기 때문에 crontab에서 실행할 때 원하는 치환을 사용하여 그냥 통과해야합니다.


0

ASCII 그룹과 함께 증분 'for'를 사용하십시오.

그것들은 당신이 다루어야하는 16 진수 값입니다 (ASCII) : 20-2F 3A-40 5B-60 7B-FF

그래서 기본적으로 단 4 건으로 숫자와 글자를 제외한 모든 문자를 커버합니다. 더 복잡한 것은 제외합니다 (예 : "-"또는 "_"를 제거하지 않는 경우).


나는이 대답을 이해하지 못한다. 당신은 for 껍질에 루프?
tripleee

선호하는 모든 유형의 조건부 루프를 사용할 수 있습니다.
Overmind

그러나 그것이 당신이 말하는 것입니다. 차례 차례로 문자의 범위를 반복하십시오. 그것은 하나의 정규식에 비해 비폭력 적으로 비효율적이 될 것입니다.
tripleee

제가 말했듯이, 그것은 선호도에 달려 있습니다. 내가 필요한 모든 ASCII 범위가 이미 정의되어 있기 때문에 실제로 모든 구문에서 단일 변수를 사용할 수 있습니다.
Overmind

나는 이것을하기위한 프로그램을 작성하는 방법을 이해하지만 그 프로그램 없이는이 질문에 실제로 대답하지 않는다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.