sed が国際文字で失敗する理由とその修正方法は?
-
09-06-2019 - |
質問
GNU sed バージョン 4.1.5 は、国際文字を使用すると失敗するようです。私の入力ファイルは次のとおりです。
Gras Och Stenar Trad -MojaからMinneapolis DVD [G2007DVD] 7812 |バツ
Gras Och Stenar Trad -MöjaからMinneapolis DVD [G2007DVD] 7812 | y
(2 行目のウムラウトに注意してください。)
そして私がそうするとき
SED 'S/.* | // '<in
XとYのみが表示されると予想しています。すべてのcharを「|」まで削除するように頼んだからです。そしてそれを超えたスペース。代わりに、次のようになります。
バツ
Gras Och Stenar Trad - From M?Y
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