tr : 아포스트로피를 ASCII로 변환


11

나는 변환하기 위해 노력하고있어 오른쪽 작은 따옴표 표시를아포스트로피 사용 tr.

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

a이 예제를 포함 하는 UTF-8로 인코딩 된 파일이 주어진 경우 :

Were not a different species
All alone?” Jeth mentioned.

OS X은 BSD를 사용하고 tr좋은 결과를냅니다.

We're not a different species
“All alone?” Jeth mentioned.

우분투는 GNU를 사용하여 다음 tr과 같은 불쾌한 결과를 낳습니다.

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

우분투에서이 변환을 어떻게 수행 할 수 있습니까?


또한 시도 : tr $ '\ xE2 \ x80 \ x99'$ '\ x27'<a> b 동일한 결과.
plamtrue


2
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
tchrist

답변:


16

다음과 같은 다른 도구를 사용해 볼 수 있습니다 sed.

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

또는 간단한 번역 작업을 수행하기 위해 다음 y명령을 사용하십시오 sed.

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

GNUtr 는 아마도 다음과 같은 이유로 작동하지 않습니다.

현재 tr1 바이트 문자 만 완전히 지원합니다. 결국 멀티 바이트 문자를 지원합니다. 이 -C 옵션을 사용하면 문자 세트를 보완하는 반면 옵션은 -c 값 세트를 보완합니다. 이 구별은 일부 값이 문자가 아닌 경우에만 중요하며 입력에 인코딩 오류가 포함 된 경우 멀티 바이트 인코딩을 사용하는 로케일에서만 가능합니다.

그리고 멀티 바이트 문자입니다.

$ echo -n \' | wc -c
1
$ echo -n  | wc -c  
3

1
sed이런 종류의 작업에 훨씬 좋습니다.
Kaz Wolfe

2
: 마지막 부분을 더 설명하기 위해 tr별도로 세 바이트 각각을 대체하고 ', 따라서 '''뿐만 아니라 그와 유사한 문자의 3 개의 바이트를 교체 한 세분화 서열 . 대신 3 바이트를 함께 한 문자를 의미하는 것으로 이해하고 대신 바꾸십시오.
deltab

멀티 바이트 문자도 잘 이해 하려면 tr -c '[:print:][:cntrl:]' '-'명령을 사용 하여 유효한 제어 문자 이외의 모든 비 인쇄 문자 를로 바꿀 수 있습니다 -. 그리고 당신은 single 처럼 3 바이트의 문자로 변환되는 것을 볼 수 ---있습니다. 멀티 바이트 문자에 대한 좋은 지적.
αғsнιη

9

큰 따옴표 및 다른 문자를 변환하려면 GNU를iconv 사용할 수 있습니다 .

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

//TRANSLIT접미사는 말한다 iconv대상 인코딩 (여기 ASCII)의 레퍼토리 외부 문자, 자동으로 유사한 문자 또는 시퀀스를 대체 할 수있다. 접미사가 없으면 iconv번역 할 수없는 문자를 찾 자마자 포기합니다.

참고 //TRANSLIT보인다는 GNU 확장 할 수 있습니다 : POSIX는iconv 지원하지 않습니다.


+1. 한 문자 세트 (또는 인코딩)에서 다른 문자 세트로 텍스트를 변환하는 경우 해당 용도로 설계된 도구를 사용하는 것이 좋습니다.
RedGrittyBrick

@deltab 솔루션은 OP가 대체하고 싶지 않은 큰 따옴표를 대체합니다.
αғsнιη

@KasiyA 어쩌면 그들은해야합니다.
gerrit

3

다음 awk솔루션 중 하나를 사용할 수 있습니다 .

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

또는

awk '{gsub(/’/, "'"'"'");print}' file

0

사용 -s옵션 tr :

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

보낸 사람 man tr :

--truncate-set1
          first truncate SET1 to length of SET2

1
귀하의 솔루션은 또한 OP가 대체하고 싶지 않은 큰 따옴표를 대체합니다
αғsнιη

아, 사실, 이것을 지적 해 주셔서 감사합니다. 이 답변을 참조로 남겨 두겠습니다.
스키 피 르 그랜드 Gourou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.