it-swarm.asia

كيفية إزالة هذا الرمز "^ @" مع vim؟

لدي بعض الملفات التالفة مع هذا الرمز:

^ @

إنها ليست جزءًا من السلسلة ؛ انها ليست قابلة للبحث. كيف يمكنني استبدال هذا الرمز بأي شيء ، أو كيف أحذف هذا الرمز؟

فيما يلي مثال لسطر من ملف واحد:

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
57
mrt181

بامكانك ان تحاول:

  • %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 ، والذي لا يمكن عرضه على خلاف ذلك) ، وليس ^ متبوعًا بـ @ ، لذلك لا يمكنك فقط كتابة ^ و @ في صف في الأمر أعلاه.

يزيل هذا الأمر كل ^@.

48
phresus

لا أعتقد أن ملفاتك تالفة. يشبه سطر المثال أنه يحتوي على نص منتظم به بايتات فارغة بين كل حرف. يشير هذا إلى أنه ملف نصي تم ترميزه في 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

49
jrb

هذا يعمل فعلا بالنسبة لي في vim:

:%s/\%x00//g
34
jriggins

يمثل هذا "الرمز" حرفًا لاغٍ ، بقيمة ASCII قيمة 000.

من الصعب إزالته باستخدام vim ، جرب

tr -d '\000' < file1 > file2
12
pavium

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
6
rpyzh

كما لاحظ آخرون ، هذه هي بايت فارغة (ASCII 00). في نظام Linux ، تتمثل طريقة إدخال قيم ASCII في vim في الضغط على Ctrl-V متبوعًا بقيمة ثمانية أرقام من أي حرف. لاستبدال جميع وحدات البايت الخالية ، استخدم:

:%s/Ctrl-V000//g

(بدون مسافات).

وبالمثل ، يمكنك البحث عن القيم الخالية باستخدام:

/Ctrl-V000

في كلتا الحالتين ، لن تظهر الأصفار أثناء كتابتها ، ولكن بعد إدخال الثلاثة ، سيتم عرض ^@. على أطراف اللون ، سيظهر أنه باللون الأزرق للإشارة إلى أنه عنصر تحكم.

6
TheAmigo

الحل المقبول لا يعمل من أجلي. أدليت 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'
3
jnylen

^@ ليس حرفًا سيئًا إذا كنت تستخدم ترميزًا مناسبًا ، ولكن إذا كنت تريد الإزالة ، فحاول:

  • tr -d '\000'
  • sed 's/\000//g'

^ M حرف هناك في البيانات المثال الخاص بك

لتحويل ملفك إلى تنسيق Unix/Linux قبل أي معالجة ، حاول:

dos2unix filename - rhel وغيرها

dos2ux filename [newfilename] - HP-UX

2
user490343

بالإضافة إلى إجابة @ 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 المناسب في هذه الحالة).

1
colemik