sed가 국제 문자로 인해 실패하는 이유와 해결 방법은 무엇입니까?
-
09-06-2019 - |
문제
GNU sed 버전 4.1.5는 국제 문자에서 실패하는 것 같습니다.내 입력 파일은 다음과 같습니다.
Gras och Stenar Trad -Moja에서 Minneapolis DVD까지 [G2007DVD] 7812 | 엑스
Gras och Stenar Trad -Möja에서 미니애폴리스 DVD까지 [G2007DVD] 7812 | 와이
(두 번째 줄의 움라우트에 주목하세요.)
그리고 내가 할 때
sed 's /.* | // '<in
나는 '|'까지 모든 숯을 제거하도록 요청했기 때문에 X와 Y 만 볼 것으로 예상됩니다. 그리고 그 너머의 공간.대신 다음을 얻습니다.
엑스
Gras Och Stenar Trad - M에서?와이
tr을 사용하여 국제 문자를 제거할 수 있다는 것을 알고 있습니다.먼저, sed를 사용할 수 있는 방법이 있나요?
해결책
파일의 입력 인코딩이 사용자 환경의 기본 인코딩과 다르면 오류가 발생한다고 생각합니다.
예: in
UTF-8입니다
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
UTF-8은 ISO-8859-1로 안전하게 해석될 수 있습니다. 이상한 문자가 표시되지만 그 외에는 모든 것이 정상입니다.
예: in
ISO-8859-1입니다
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Gras Och Stenar Trad - From MöY
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
ISO-8859-1은 UTF-8로 해석될 수 없으며 입력 파일 디코딩에 실패합니다.이상한 일치는 아마도 sed가 완전히 실패하는 대신 복구를 시도한다는 사실 때문일 것입니다.
대답은 Debian Lenny/Sid 및 sed 4.1.5를 기반으로 합니다.
다른 팁
sed
ASCII가 아닌 텍스트에는 잘 설정되지 않았습니다.그러나 다음에서 (거의) 동일한 코드를 사용할 수 있습니다. perl
원하는 결과를 얻으십시오.
perl -pe 's/.*\| //' x