Windows 시스템에서 WSL을 사용하여 실행되는 일부 명령을 다시 작성 중이며 Python에서도 동일한 작업을 수행해야 합니다. 이 명령이 정확히 무엇을 수행하려고 하는지 파악하는 데 어려움을 겪고 있습니다.
다음은 명령과 내가 지금까지 알고 있는 내용입니다.
wsl tr -dc \'\\007-\\011\\012-\\015\\040-\\376\' < some.txt > someother.txt
- 이 명령은 some.txt에서 일부 정크 문자를 제거하기 위해 8진수 이스케이프 시퀀스 범위를 사용하는 것 같습니다. 하지만 이번에도 정확히 어떤 문자가 제거되었는지, 텍스트 파일에서 어떤 문자가 제거되었는지 파악하는 데 어려움을 겪고 있습니다.wsl tr -d \'\\333\' < someother.txt > some.txt
- 이것은 나에게 완전한 미스터리입니다. 나는 8진수 333을 찾아보았는데 거기에는 연관된 ASCII 코드도 있었습니다.wsl tr \"|\" \" \"
- 이 명령은 특정 파이프 문자를 공백으로 바꾸는 명령이라고 하는데 어떤 문자인지 파악하는 데 어려움이 있습니다.
도움을 주시면 감사하겠습니다! 감사합니다!
답변1
분명히 이것은 cmd, powershell 또는 sh 구문의 명령이 아닙니다. 추가 백슬래시 이스케이프 계층이 있습니다. 백슬래시 이스케이프를 완료하면 다음 sh 명령이 남습니다.
wsl tr -dc '\007-\011\012-\015\040-\376' < some.txt > someother.txt
wsl tr -d '\333' < someother.txt > some.txt
wsl tr "|" " "
처음 두 명령은 파일을 읽고 씁니다. 마지막 것은 표준 입력에서 읽고 표준 출력에 쓰는 것입니다.
옵션이 아닌 인수에서 tr
백슬래시 뒤에 3개의 8진수 숫자가 오면 해당 값이 숫자로 제공되는 바이트를 나타냅니다. 두 바이트 사이의 ASCII 하이픈( -
)은 과(과) 사이의 값을 갖는 모든 바이트를 나타냅니다.
첫 번째 명령은 다음 두 인수를 tr
: -dc
및 에 전달합니다 \007-\011\012-\015\040-\376
. -dc
다음 매개변수에 값이 지정된 바이트를 제외한 모든 바이트를 삭제한다는 의미입니다. 즉, 지정된 바이트는 유지되고 다른 모든 바이트는 삭제됩니다. 예약된 바이트는 다음과 같습니다.
\007-\011\012-\015
: 7에서 13 사이의 값을 갖는 바이트, 즉제어 문자 벨(벨),BS(백스페이스 키),HT(가로 탭),LF(줄 바꿈),VT(세로 탭),FF(페이지 피드)그리고CR(캐리지 리턴). 그런데 Windows 줄 끝은 두 문자 시퀀스 CR LF인 반면 Unix 줄 끝은 단일 문자 LF입니다.\040-\376
: 이 내용은 모든 내용을 다룹니다.인쇄 가능한 ASCII 문자어떤 이유로 가장 사용되지 않는 문자 127과 255를 제외한 모든 비ASCII 문자도 포함됩니다. 바이트 값 255는 UTF-8에는 나타나지 않지만 많은 기존 8비트 문자 집합에서는 일반 문자입니다.
따라서 이것은 제어 문자(모든 공백 및 일부 비공백 문자 제외)를 제거하고 일부 버그가 있는 소프트웨어가 파일 끝으로 해석하는 바이트 255를 제거하는 다소 이상한 방법입니다.
두 번째 명령은 다음 두 인수를 tr
: -d
및 에 전달합니다 \333
. ( -d
) 바이트 (십진수 219, 16진수 0xdb)를 제거합니다 \333
. 이 특정 바이트 값을 제거하려는 이유가 무엇인지 모르겠습니다.
세 번째 명령은 다음 매개변수를 tr
: |
및 (공백)에 전달합니다. 이는 모든 문자
|
(ASCII 수직선, 파이프라고도 함)를 일반 ASCII 공백으로 대체합니다. 이는 |
"일부" 항목뿐만 아니라 모든 항목을 대체합니다.
Python에서는 다음을 사용할 수 있습니다.
import re
그런 다음re.sub(rb'\000-\006\016-\037\377', rb'', x)
, 또는bytes.maketrans
이어서x.번역x.replace(b'\333'. b'')
x.replace(b'|'. b' ')
1 일부 구현은 tr
멀티바이트 문자를 지원하지만 tr
내가 아는 한 WSL에서 제공하는 GNU는 지원하지 않습니다.