![tr: 아포스트로피를 ASCII로 변환](https://rvso.com/image/977082/tr%3A%20%EC%95%84%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A1%9C%ED%94%BC%EB%A5%BC%20ASCII%EB%A1%9C%20%EB%B3%80%ED%99%98.png)
변환하려고 합니다.오른쪽 작은따옴표에게아포스트로피을 사용하여 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
번역할 수 없는 문자를 발견하자마자 포기합니다.
//TRANSLIT
GNU 확장인 것 같습니다 .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