sed를 사용하여 U + 200B (제로 너비 공간)를 삭제하는 방법


15

너비가 0 인 공간이 흩어져있는 매우 큰 파일이 있습니다. 를 사용하여 열고 편집하는 데 시간이 너무 오래 걸리므로를 사용 vi하여 캐릭터의 모든 인스턴스를 삭제하고 싶습니다 sed. 문제는 캐릭터와 일치하는 방법을 알 수 없다는 것입니다! \u200B,을 사용해 보았습니다 \x{200b}. 어떤 아이디어?

도움이된다면 CentOS 5를 실행하고 있습니다.


sed 사본이 파일이 인코딩 된 유니 코드 인코딩을 지원합니까? sed로 제대로 할 수있는 방법이 없다면, 파이썬 스크립트 나 그와 비슷한 것을 사용하는 것이 좋습니다.
JanC

@ JanCan-실제로, 나는 파이썬과 함께 갔다. 파일은 utf8로 인코딩되어 있으며 어떤 것이라도 처리 할 수있을 정도로 표준적인 것 같습니다. 누군가에게 유용 할 수 있도록 아래에 파이썬 스크립트를 추가했습니다.
thetaiko

답변:


11

이것은 나를 위해 작동하는 것 같습니다 :

sed 's/\xe2\x80\x8b//g' inputfile

데모:

$ /usr/bin/printf 'X\u200bY\u200bZ' | hexdump -C
00000000  58 e2 80 8b 59 e2 80 8b  5a                       |X...Y...Z|
$ /usr/bin/printf 'X\u200bY\u200bZ' | sed 's/\xe2\x80\x8b//g' | hexdump -C
00000000  58 59 5a                                          |XYZ|

편집하다:

Gilles의 답변을 부분적으로 기반으로 :

tr -d $(/usr/bin/printf "\u200b") < inputfile

완벽-이것은 내가 찾던 것입니다. 실제로 \xe2\x80\x8b파이썬에서 일부 샘플 문자열을 볼 때 동일한 문자 세트 ( )를 발견했습니다 . 감사합니다!
thetaiko

4

UTF-8을 사용한 GNU sed의 동작은 잘 정의되지 않은 것 같습니다. 실험적으로 UTF-8 표현의 바이트를 대체 할 수 있습니다.

<old sed 's/\xe2\x80\e8b//g' >new

또는 문자를 쉘에 입력하고 UTF-8 로켈의 표준 명령을 사용할 수 있습니다.

<old tr -d '​' >new
<old sed 's/​//g' >new

zsh에서는 이스케이프 시퀀스를 통해 문자를 입력 할 수도 있습니다.

<old tr -d $'\u200B' >new

배시 4.2 같이, 유니 코드 시퀀스에 의해지지되어 echo -e, printf형식 문자열과 ANSI 문자열을 인용 (예를 들어 echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
일시 중지 추가 통지가있을 때까지.

0

글쎄, 누구 든지이 sed작업을 수행 하는 방법에 대한 아이디어가 없다면 (아직 내가 관심이있는) 파이썬을 구조에 ...

import sys, re
pattern = re.compile(u"\u200b")
f = open(sys.stdin, "rb")
for line in f:
    a = pattern.sub("", line.decode("utf8"))
    print a.encode("utf8"),
f.close()

2
당신이 큰 총에 도달한다면, 훨씬 더 간단한 것은 perl -C -pe 's/\x{200B}//g'어떻습니까?
Gilles 'SO- 악마 그만해

Mac OSX에서도 작동하는 Gilles에 +1 perl -C -pi.bak -e 's/\x{200B}//g' yourfile파일 수정 및 yourfile.bak 백업
MarkHu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.