POSIX sed를 사용하여 인쇄할 수 없는 문자 제거

POSIX sed를 사용하여 인쇄할 수 없는 문자 제거

roff다른 "구식" 도구(예: 많은 Unix 시스템의 매뉴얼 페이지)를 사용하여 생성된 파일은 굵은 텍스트를 ^H얻기 위해 인쇄할 수 없는 ASCII 문자(예: "반백스페이스")와 관련된 트릭을 사용하여 미니멀리스트 터미널에서 굵은 글씨와 밑줄이 그어진 텍스트를 생성합니다. 밑줄 친 텍스트. 예:

b^Hbo^Hol^Hld^Hd and _^Hu_^Hn_^Hd_^He_^Hr_^Hl_^Hi_^Hn_^He_^Hd

bold and underline사람이 읽을 수 있는 일반 텍스트 (형식 무시) 로 변환하려면 vim다음과 같은 것을 사용할 수 있습니다 :%s:\(.\)\b\1:\1:ge | %s:_\b\(.\):\1:ge.

또한 텍스트를 파이프 tr -dc하고 Perl의 정규식 마법을 사용하여 완전히 반복되는 문자 쌍으로 구성된 단어를 찾을 수도 있습니다.

sed그러나 이는 일반 작업이 처리할 수 있어야 하는 것처럼 보이며, 이를 통해 스크립트에서 더 깔끔하게 사용할 수 있습니다.

질문:이 번역 괜찮나요?오직POSIX를 사용하고 있습니까 sed? 즉, GNU 또는 BSD 확장을 사용하지 않습니까?

^H여기서 문제를 일으키는 것은 단지 인쇄할 수 없는 문자(ASCII #8)입니다 . Bruce Barnett의 책에는 트릭이 언급되어 있습니다.Sed - 소개, 하지만 어떻게 든 작동하게 할 수 없습니다.

답변1

너 이거 할 수 있어?오직POSIX를 사용하시나요 sed? 예:

sed -e 's/.^H//g' < data

이는 ^H문자 그대로의 백스페이스 문자입니다. POSIX sed사용POSIX 기본 정규식, 바이트로 정의됩니다. 문자가 인쇄되는지 여부에 상관하지 않으므로 ^H문자와 동일하게 동작합니다. 여기에는 확장이 포함되지 않습니다. 실제로 원하는 것은 백스페이스 문자를 제거하는 것이므로 예제의 캡처 그룹은 실제로 필요하지 않습니다.

대부분의 경우 백스페이스 문자를 입력할 수 있습니다 Ctrl+V Ctrl+H.

귀하의 기본 질문은 "쉘 스크립트에서 이 작업을 어떻게 수행합니까?"라고 생각합니다. 문자 그대로의 백스페이스 문자는 불쾌할 수 있습니다(물론 vim기꺼이 동일한 을 받아들 일지라도 Ctrl+V Ctrl+H). 이것이 귀하의 링크에 대한 소개입니다 tr.

POSIXtr지원하다다양한 종류이스케이프 문자\b, 백스페이스 문자의 기호 이스케이프 포함. 백스페이스 문자를 변수에 저장하고 해당 변수를 sed위의 표현식으로 바꿀 수 있습니다.

BACKSPACE=$(echo x | tr 'x' '\b')
sed -e "s/.$BACKSPACE//g" < data

tr우리는 단지 an을 백스페이스 문자로 바꾸고 단일 문자를 입력으로 제공하도록 지시합니다 . 이는 Solaris를 포함하여 내가 액세스할 수 있는 모든 시스템에서 잘 작동합니다. 하지만,xxprintfPOSIX에서 정의한 도구이기도 합니다.이며 동일한 이스케이프를 지원합니다.

BACKSPACE=$(printf '\b')
sed -e "s/.$BACKSPACE//g" < data

이는 tr버전보다 더 간단하고 간단합니다. sed더 이상 변수 보간을 억제하지 않도록 표현식 주위에 큰따옴표를 기록해 두십시오 . 당신은 또한 사용할 수 있습니다명령 대체printf '\b'한 번만 사용하고 싶다면 변수를 사용하는 대신 인라인을 사용하여 직접 넣을 수 있습니다.

hexdump이것이 (또는 ) 에 적용되는지 확인할 수 있습니다 hd.

$ dash
$ hexdump -C data
00000000  62 08 62 6f 08 6f 6c 08  6c 64 08 64 0a           |b.bo.ol.ld.d.|
$ BACKSPACE=$(printf '\b')
$ sed -e "s/.$BACKSPACE//g" < data | hexdump -C
00000000  62 6f 6c 64 0a                                    |bold.|

필요한 경우 백스페이스 문자와 삭제된 선행 문자가 출력에서 ​​제거됩니다( 0a종료 문자).

관련 정보