لماذا يفشل sed مع الأحرف الدولية وكيفية إصلاحه؟
-
09-06-2019 - |
سؤال
يبدو أن الإصدار 4.1.5 من GNU sed قد فشل مع الأحرف الدولية.هنا هو ملف الإدخال الخاص بي:
Gras Och Stenar Trad - من Moja إلى Minneapolis DVD [G2007DVD] 7812 | x
Gras Och Stenar Trad - من Möja إلى Minneapolis DVD [G2007DVD] 7812 | ذ
(لاحظ علامة التشكيل في السطر الثاني.)
وعندما أفعل
SED 'S/.* | // '<في
أتوقع أن أرى فقط X و Y ، حيث طلبت إزالة جميع الأحرف إلى "|" والمساحة وراء ذلك.بدلا من ذلك، أحصل على:
X
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