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

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

변환하려고 합니다.오른쪽 작은따옴표에게아포스트로피을 사용하여 tr.

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

a다음 예제가 포함된 UTF-8 인코딩 파일이 제공됩니다 .

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

OS X은 BSD를 사용하여 tr좋은 결과를 생성합니다.

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

Ubuntu는 GNU를 사용하여 tr다음과 같은 불쾌한 결과를 생성합니다.

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

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

답변1

다음과 같은 다른 도구를 사용해 볼 수 있습니다 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.

암소 비슷한 일종의 영양tr아마도 다음과 같은 이유로 작동하지 않습니다.

현재는 tr단일 바이트 문자만 완전히 지원합니다. 결국에는 멀티바이트 문자를 지원할 예정입니다. 그럴 경우 -C 옵션은 문자 집합을 보완하는 반면 -c 값 집합을 보완하게 합니다. 이러한 구별은 일부 값이 문자가 아닌 경우에만 중요하며, 입력에 인코딩 오류가 있는 경우 멀티바이트 인코딩을 사용하는 로케일에서만 가능합니다.

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

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

답변2

큰따옴표 및 다른 문자도 변환하려면 다음을 사용할 수 있습니다.암소 비슷한 일종의 영양iconv:

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

접미사 는 대상 인코딩(여기서는 ASCII) 레퍼토리 외부의 문자에 대해 유사한 모양의 문자나 시퀀스를 자동으로 대체할 수 있음을 //TRANSLIT나타냅니다 . iconv접미사가 없으면 iconv번역할 수 없는 문자를 발견하자마자 포기합니다.

//TRANSLITGNU 확장인 것 같습니다 .POSIXiconv그것을 지원하지 않습니다.

답변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

답변4

-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

관련 정보