모든 문자 표시 및 제거> ASCII 코드 127


2

파일에서 모든 문자> ASCII 코드 127을 표시하고 제거하는 방법은 무엇입니까?

파일은 유니 코드 16 비트입니다

업데이트 Dennis가 해결했지만 숫자 범위에 대한 흥미로운 토론이 있습니다.


왜 그런가요?
grawity

@gravvity 왜 물어?
barlop

그것은 당신이 그것에 대해 어떻게 변화 시키는가. 추가 질문 : Cygwin 또는 GNUWin32 등을 통해 사용 가능한 Unix 스타일 도구가 있습니까?
Dennis Williamson

@Dennis Williamson 나는 그것에 대해 많은 옵션을 열었습니다. Cygwin과 Gnuwin32가 모두 있는데, 그 방법을 통해 처리하는 것이 좋지만 문제는 내 파일이 유니 코드 16 비트라는 것입니다. 나는 라인 : 고양이 | od -c는 각 문자 사이의 \ 0을 해석하고 grep이 작동하지 않습니다. grep에서 보이는 abc 문자는 아마도 같은 이유로 인접하지 않습니다. 그들은 문자 당 8 비트를 가정합니다.
barlop

유니 코드 파일이 있기 때문에 이것이 사실 인 이유를 알아야하며 추가 정보를 요청했습니다. 유니 코드 파일에서 바이트 값을 가진 바이트 ( "문자"및 "ASCII 코드"를 말하지 않았다는 점에 유의)를 제거하면 이상한 결과가 나타납니다. 당신이 정말로 하려고하는 것은 무엇입니까?
Dennis Williamson

답변:


1

한 가지 방법은 파일을 16 진수로 변환하고 원하지 않는 숫자 패턴을 제거한 다음 다시 변환하는 것입니다.

$ echo 'A Unicode character: [ñ]' | xxd -p | sed 's/c3b1//' | xxd -r -p
A Unicode character: []

대신 AWK 또는 다른 텍스트 조작 기술을 사용할 수 있습니다 sed. 모호한 순서에주의하십시오.

이것이 당신이 생각하는 것에 접근하는지 알려주세요.



거기에서 나는 아마 내가 어떻게했는지 알 수있다 .. od -x myfile | 시작시 FEFF를 지나쳐 잘라 내 육각 범위 내에서 정규식의 쌍을 sed로 캡처하십시오.
barlop

실제로, 내 컷 아이디어는 그것을 잘라 내지 않을 것입니다. 그러나 예, 16 진수를보고 16 진수에 대한 정규 표현식으로 작업하고 다시 쓸 수있는 프로그램이나 세트의 아이디어는 내가 생각한 일반적인 접근법 중 하나입니다.. i 요구 사항에 맞게 조정하는 방법에 관심이 있습니다. 문제가 생길 경우 다른 접근법에 대한 스케치를 게시 할 수 있습니다. 관심이 있고 유용 할 것 같습니다.
barlop

나는 실제로 당신이 준 스케치를 통해 거기에 도착하고 있으며 cut을 사용하여 tr -d '\ n'을 그리워했습니다.
barlop

실제로 나는 스케치를 조정하려고 붙어 있습니다. 스케치는 괜찮습니다 (물론 아시다시피!).하지만 내 조정은 문제입니다. 'cos 나는 후에 그것을 알고 | tr -d '\ n'다음 5를 자르면 작동합니다. FEFF 또는 [8-F] [0-F] [0-F] [0-F]라고 말하고 싶을뿐입니다. 2 문자의 바이트를 겹치지 않으려 고합니다. 그리고 sed의 find 섹션에 넣은 것은 무엇이든갑니다. 따라서 모든 바이트 쌍을 일치 시키려면 로트가 삭제됩니다. 그리고 sed를 사용하여 바이트 쌍을 조건부로 바꿀 수 있는지 여부가 확실하지 않습니다.
barlop

0

이 질문을 다시 보면서

마지막에이 줄 중 하나를 사용한 것 같습니다.

(데니스의 정규식으로 간주 됨)

$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[8-9a-f][0-9a-f]|[0-9a-f][1-9a-f][0-9a-f][0-9a-f]|[1-9a-f]0[0-9a-f][0-9a-f])//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2

또는 이것 (내 정규식으로 간주 됨)

$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3})//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2

이것은 몇 가지 테스트로 내가 어떻게 작동했는지에 대한 논평입니다.

0080-00FF     00[89A-F][0-9A-F]
0100-0FFF     0[1-9A-F][0-9A-F]{2}
1000-FFFF     [1-9A-F][0-9A-F]{3}

다음은 정규식이 작동한다는 것을 보여주는 몇 가지 테스트입니다. 나는 그것을 해결할 때 내 질문에 넣었지만 대답에 넣어야했다.

총 16 진법

$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "[0-9A-F]{4}" | wc -l
85

내가 원하는 총 72

$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" | wc -
l
72

내가 원하지 않는 총 13

$ xxd -p -u a.aa.txt | sed -r "s/[0-9A-F]{4}/\0 /g" | grep -oP '((?!00[0-7][0-9A-F])(?=[^ ]).){4}' | wc -l
13

내가 원하지 않는 총 13

$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3}" | wc –l
13

그리고 지금 그것을 보면서 나는이 테스트에서 유지하고 싶은 유니 코드 16 진수 문자를 grep하지 않은 이유가 무엇인지 궁금 $ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" 합니다. (후자는 훨씬 긴 정규 표현식에 해당)
barlop

그건 그렇고, 첫 번째 xxd -p aq 줄은 dennis의 의견에 정규식을 사용하고 두 번째는 내가 생각 해낸 정규식을 사용합니다.
barlop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.