2008-09-15 3 views
15

GNU sed 버전 4.1.5는 국제 문자와 함께 실패한 것 같습니다. 여기 내 입력 파일은 다음과 같습니다.국제 문자로 sed가 실패하고 수정하는 이유는 무엇입니까?

Gras Och Stenar Trad - Moja에서 Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - Möja에서 Minneapolis DVD [G2007DVD] 7812 | Y

을 (두 번째 줄에 움라우트 있습니다.) 내가

나오지도의 /.* 할 | // '< in

모든 문자를'| '까지 제거하도록 요청 했으므로 X와 Y 만 볼 것으로 예상됩니다. 그리고 그 너머 공간. 대신, 얻을 :

x
Gras Och Stenar Trad - M? Y

tr을 사용하여 국제 문자를 제거 할 수 있음을 알고 있습니다. 우선 sed를 사용하는 방법이 있습니까?

+0

이 문제는 GNU sed (버전 4.2.2에서 테스트 됨)로 해결 된 것으로 보입니다. – sorontar

답변

24

내가 파일의 입력 인코딩 환경의 기본 인코딩과 다른 경우 오류가 발생 생각합니다.

예 : in는 UTF-8 UTF-8 안전하게 ISO-8859-1로 해석 될 수

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Y 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

, 당신은 이상한 문자를 얻을 수 있지만, 그 외에도 모든에서 괜찮 것입니다.

예 : in 입력 파일이 디코딩 실패,

$ 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로 해석 할 수 없다 ISO-8859-1이다. 이상한 일치는 아마 sed가 완전히 실패하기보다는 회복하려고 시도한다는 사실 때문일 것입니다.

답변은 데비안 Lenny/Sid와 sed 4.1.5를 기반으로합니다.

+0

그것도 작동하며, 내가 sed를 사용할 수있게 해준다. 감사! – Dave

9

sed은 비 ASCII 텍스트의 경우 잘 설정되지 않습니다. 당신이 perl에서 (거의) 같은 코드를 사용하고 결과를 얻을 수 있습니다 그러나 당신이 원하는 :

perl -pe 's/.*\| //' x 
+0

이 힌트는 매우 유용합니다. –

관련 문제