لدي بعض الملفات التالفة مع هذا الرمز:
^ @
إنها ليست جزءًا من السلسلة ؛ انها ليست قابلة للبحث. كيف يمكنني استبدال هذا الرمز بأي شيء ، أو كيف أحذف هذا الرمز؟
فيما يلي مثال لسطر من ملف واحد:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
بامكانك ان تحاول:
%s/<CTRL-2>//g
(على أجهزة الكمبيوتر العادية)
%s/<CTRL-SHIFT-2>//g
(على أجهزة كمبيوتر Mac)
حيث <CTRL-2>
تعني أولاً اضغط لأسفل CTRL على أجهزة الكمبيوتر العادية ، والحفاظ عليها كما هو الضغط باستمرار ، وضرب 2، إطلاق سراح CTRL.
و <CTRL-SHIFT-2>
يعني أولاً الضغط لأسفل control على أجهزة Mac ، إبقائها مضغوطة باستمرار ، اضغط لأسفل shift على أجهزة Mac ، ابقها مضغوطة 2، إطلاق سراح control و shift.
أخيرًا ، يجب أن ينتج كلا الأمرين %s/^@//g
على الشاشة. يعني ^@
حرفًا واحدًا (بايت NULL ، والذي لا يمكن عرضه على خلاف ذلك) ، وليس ^
متبوعًا بـ @
، لذلك لا يمكنك فقط كتابة ^
و @
في صف في الأمر أعلاه.
يزيل هذا الأمر كل ^@
.
لا أعتقد أن ملفاتك تالفة. يشبه سطر المثال أنه يحتوي على نص منتظم به بايتات فارغة بين كل حرف. يشير هذا إلى أنه ملف نصي تم ترميزه في UTF-16 ولكن علامة ترتيب البايت مفقودة من بداية الملف. راجع http://en.wikipedia.org/wiki/Byte-order_mark
افترض أن أفتح "المفكرة" ، واكتب الكلمة "filename" ، وحفظها كـ Unicode Big-endian. يبدو تفريغ سداسي عشرية من هذا الملف كما يلي:
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
إذا قمت بفتح هذا الملف في Vim ، يبدو جيدًا - تخبر وحدات البايت 'fe ff' Vim كيف يتم تشفير الملف. لنفترض الآن أنني أقوم بإنشاء ملف يحتوي على نفس تسلسل وحدات البايت بالضبط ، ولكن بدون العلامة "fe ff". يدرج Vim ^ @ (أو <00> ، اعتمادًا على التكوين الخاص بك) ، بدلاً من وحدات البايت الخالية ؛ المفكرة إدراج مسافات.
لذا بدلاً من إزالة القيم الخالية ، يجب أن تبحث عن Vim لتفسير الملف بشكل صحيح. يمكنك الحصول على Vim لإعادة تحميل الملف بالتشفير الصحيح باستخدام الأمر:
:e ++enc=utf16
هذا يعمل فعلا بالنسبة لي في vim:
:%s/\%x00//g
يمثل هذا "الرمز" حرفًا لاغٍ ، بقيمة ASCII قيمة 000.
من الصعب إزالته باستخدام vim ، جرب
tr -d '\000' < file1 > file2
FWIW ، في حالتي ، كان علي استخدام vim على cygwin لتحرير ملف نصي تم إنشاؤه على جهاز mac. الحل المقبول لم ينجح بالنسبة لي ، لكنه كان قريبًا. وفقًا لـ صفحة Vim wiki حول العمل مع Unicode ، هناك فرق بين إصدارات Big Endian و Little Endian من بايت BOM. لذلك ، اضطررت إلى إخبار vim
صراحة باستخدام إصدار Little Endian لترميز BOM.
فقط بعد اختيار الترميز الصحيح قمت بتحويل تنسيق الملف (نهايات الخطوط) إلى dos
حتى أتمكن من تحرير الملف في محرر Windows. محاولة تعيين إعادة تعيين تنسيق الملف قبل تحديد الترميز أعطاني الحزن. فيما يلي قائمة كاملة بالأوامر التي استخدمتها:
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
كما لاحظ آخرون ، هذه هي بايت فارغة (ASCII 00). في نظام Linux ، تتمثل طريقة إدخال قيم ASCII في vim في الضغط على Ctrl-V متبوعًا بقيمة ثمانية أرقام من أي حرف. لاستبدال جميع وحدات البايت الخالية ، استخدم:
:%s/
Ctrl-V000//g
(بدون مسافات).
وبالمثل ، يمكنك البحث عن القيم الخالية باستخدام:
/
Ctrl-V000
في كلتا الحالتين ، لن تظهر الأصفار أثناء كتابتها ، ولكن بعد إدخال الثلاثة ، سيتم عرض ^@
. على أطراف اللون ، سيظهر أنه باللون الأزرق للإشارة إلى أنه عنصر تحكم.
الحل المقبول لا يعمل من أجلي. أدليت vim pipe الملف عبر tr
بدلاً من ذلك:
:%!tr -d '\000'
قد يعمل هذا أيضًا بشكل جيد مع الوضع المرئي (فقط اكتب :!tr -d '\000'
) أو على مجموعة من الخطوط:
# Remove nulls from current line:
:.!tr -d '\000'
# Remove nulls from lines 3-5:
:3,5!tr -d '\000'
^@
ليس حرفًا سيئًا إذا كنت تستخدم ترميزًا مناسبًا ، ولكن إذا كنت تريد الإزالة ، فحاول:
tr -d '\000'
sed 's/\000//g'
^ M حرف هناك في البيانات المثال الخاص بك
لتحويل ملفك إلى تنسيق Unix/Linux قبل أي معالجة ، حاول:
dos2unix filename
- rhel وغيرها
dos2ux filename [newfilename]
- HP-UX
بالإضافة إلى إجابة @ jrb ، في Vim ، يتم اكتشاف ترميز الأحرف للملف بناءً على خيار fileencodings. (لاحظ "لاعبالزبون" في نهاية ملف الرموز)
أي. في Windows ، القيمة الافتراضية لخيار fileencodings
هي ucs-bom
، مما يعني:
تحقق مما إذا كان BOM موجودًا في بداية الملف.
إذا كان BOM موجودًا ، فقم بقراءة ترميز الأحرف للملف خارج BOM.
إذا لم يكن BOM موجودًا (وفي هذه الحالة ، فهذا يعني أيضًا أن كل ترميزات الأحرف المحددة في الخيار fileencodings
لم تتطابق) ، فاقرأ الملف مع ترميز الأحرف المحدد في الخيار encoding
. ترميز الأحرف الافتراضي لخيار encoding
هو: latin1
. الآن ، لأن latin1
هو بايت واحد ترميز حرف الطول ، الكل البايتات في الملف ، توجد أحرف latin1
صالحة (حتى الأحرف Nul
^@
التي تشاهدها *).
* - في الواقع ، ^@
هو حرف السطر الجديد في نص المخزن المؤقت لـ Vim ، وليس حرف Nul.
الطريقة الصحيحة لقراءة الملف هي تحديد ترميز الأحرف يدويًا على أنه UTF-16 (يبدو أن UTF-16 هو ترميز char المناسب في هذه الحالة).