استخدام awk لإزالة علامة ترتيب البايت
-
21-08-2019 - |
سؤال
كيف يمكن ل awk
البرنامج النصي (من المفترض أن يكون سطرًا واحدًا) لإزالة ملف بوم يبدو مثل؟
تخصيص:
- طباعة كل سطر بعد الأول (
NR > 1
) - للسطر الأول:إذا بدأ ب
#FE #FF
أو#FF #FE
, ، قم بإزالة تلك وطباعة الباقي
المحلول
جرب هذا:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
في السجل الأول (السطر)، قم بإزالة أحرف قائمة مكونات الصنف (BOM).طباعة كل سجل.
أو أقصر قليلًا، باستخدام معرفة أن الإجراء الافتراضي في awk هو طباعة السجل:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
هو الشرط الأقصر الذي يتم تقييمه دائمًا على أنه صحيح، لذلك تتم طباعة كل سجل.
يتمتع!
-- إضافة --
الأسئلة الشائعة حول علامة ترتيب البايت Unicode (BOM). يتضمن الجدول التالي الذي يسرد بايتات BOM الدقيقة لكل ترميز:
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
وهكذا، يمكنك أن ترى كيف \xef\xbb\xbf
يتوافق مع EF BB BF
UTF-8
بايت BOM من الجدول أعلاه.
نصائح أخرى
باستخدام جنو sed
(على Linux أو Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
على فري بي إس دي:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
ميزة استخدام GNU أو FreeBSD sed
:ال -i
المعلمة تعني "في مكانها"، وستقوم بتحديث الملفات دون الحاجة إلى عمليات إعادة توجيه أو حيل غريبة.
على ماك:
هذا awk
الحل في إجابة أخرى يعمل, ، لكن ال sed
الأمر أعلاه لا يعمل.على الأقل على نظام Mac (سييرا) sed
لا تذكر الوثائق دعم الهروب السداسي العشري علاء \xef
.
يمكن تحقيق خدعة مماثلة باستخدام أي برنامج عن طريق توصيل الأنابيب إلى ملف sponge
أداة من com.moreutils:
awk '…' INFILE | sponge INFILE
ليس محرجا، ولكن أبسط:
tail -c +4 UTF8 > UTF8.nobom
للتحقق من BOM:
hd -n 3 UTF8
إذا كان BOM موجودًا، فسترى: 00000000 ef bb bf ...
بالإضافة إلى تحويل نهايات خطوط CRLF إلى LF، dos2unix
يزيل أيضًا BOMs:
dos2unix *.txt
dos2unix
يقوم أيضًا بتحويل ملفات UTF-16 باستخدام BOM (ولكن ليس ملفات UTF-16 بدون BOM) إلى UTF-8 بدون BOM:
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
أعلم أن السؤال كان موجهًا إلى نظام التشغيل Unix/Linux، وأعتقد أنه من المفيد أن نذكر خيارًا جيدًا لنظام التشغيل Unix (على نظام التشغيل Windows، مع واجهة المستخدم).
لقد واجهت نفس المشكلة في مشروع WordPress (كان BOM يسبب مشاكل في موجز RSS والتحقق من صحة الصفحة) وكان علي أن أبحث في جميع الملفات الموجودة في شجرة دليل كبيرة جدًا للعثور على الملف الذي كان مع BOM.العثور على تطبيق يسمى استبدال بايونير وفيه:
Batch Runner -> بحث (للعثور على جميع الملفات الموجودة في المجلدات الفرعية) -> استبدال القالب -> ثنائي إزالة قائمة مكونات الصنف (يوجد بحث جاهز واستبدال القالب لهذا الغرض).
لم يكن الحل الأكثر أناقة، وكان يتطلب تثبيت برنامج، وهو ما يمثل جانبًا سلبيًا.ولكن بمجرد أن اكتشفت ما كان يدور حولي، عملت كالسحر (وعثرت على 3 ملفات من حوالي 2300 كانت مع BOM).