سؤال

كيف يمكن ل 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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top