vim - كيفية استبدال حرف بواسطة سطر جديد في فيم؟




replace escaping (8)

أحاول استبدال كل ملف , في الملف الحالي بخط جديد:

:%s/,/\n/g 

ولكنها تدرج ما يبدو وكأنه ^@ بدلاً من سطر جديد فعلي. الملف ليس في وضع DOS أو أي شيء.

ماذا علي أن أفعل؟

إذا كنت فضوليًا ، مثلي ، فتحقق من السؤال ما هو \ r newline لـ Vim؟ كذلك.


استخدم \r بدلاً من \n .

يؤدي استبدال \n إدراج حرف فارغ في النص. للحصول على سطر جديد ، استخدم \r . عند البحث عن سطر جديد ، ما زلت تستخدم \n ، على أي حال. يرجع عدم التناظر هذا إلى حقيقة أن \n و \r يؤديان أشياء مختلفة قليلاً :

\n يتطابق مع نهاية السطر (السطر الجديد) ، بينما \r يتطابق مع حرف إرجاع. من ناحية أخرى ، في التبديلات \n تدرج حرفًا فارغًا بينما تقوم بإدراج سطر جديد (بشكل أكثر دقة ، يتم معاملته كمدخل <CR> ). إليك مثال صغير غير تفاعلي لتوضيح ذلك ، باستخدام ميزة سطر أوامر Vim (وبعبارة أخرى ، يمكنك نسخ ولصق ما يلي في الطرفية لتشغيله). يعرض xxd hexdump للملف الناتج.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

بمعنى آخر ، \n تم إدراج البايت 0x00 في النص ؛ \r إدراج البايت 0x0a.


إذا كنت بحاجة إلى إجراء ملف كامل ، فقد تمت الإشارة أيضًا إلى أنه يمكنك المحاولة من سطر الأوامر

sed 's/\\n/\n/g' file > newfile

تحتاج إلى استخدام

:%s/,/^M/g

للحصول على الحرف ^M ، اضغط على Ctrl v متبوعًا بإدخال


في بناء الجملة s/foo/bar \r و \n لها معانٍ مختلفة ، وفقًا للسياق.

من أجل foo :
\ n = السطر الجديد
\ r = CR (حرف الإرجاع = Ctrl-M = ^ M)

bar :
\ r = هو سطر جديد
\ n = بايت فارغ (0x00).

لقد رأيت أسئلة حول مثل هذه الأشياء في كثير من الأحيان في الماضي ، وفي وقت ما في المستقبل ، لن يعرف أحد تقريبًا أي شيء عن هذه الأشياء في النهاية ...

حسب الطلب "الشعبي":

هنا قائمة من أحرف التحكم ASCII ، إدراجها في vim عبر CTRL v CTRL --- مفتاح --- .
في bash أو قذائف unix / linux الأخرى فقط اكتب CTRL --- key --- . جرب CTRL M في bash ، وهو نفس ضرب دخول ENTER ، حيث يدرك الغلاف ما هو المقصود ، على الرغم من أن أنظمة linux تستخدم Line Feeds لتحديد الخطوط. فقط char control for Line Feed هو CTRL-A ، والذي يرتبط بـ "الانتقال إلى بداية السطر" في bash.

لإدراج حرفية في bash ، سيعمل CTRL v أيضًا.

جرب في bash:

echo ^[[33;1mcolored.^[[0mnot colored.

هذا يستخدم تسلسلات هروب ANSI ، أدخل الاثنين ^[ 's عبر CTRL v ESC .

يمكنك أيضًا تجربة CTRL v CTRL m ENTER ، والتي ستعطيك هذا:

bash: $'\r': command not found

تذكر \r من فوق؟ :>

تختلف قائمة أحرف تحكم ASCII عن جدول رموز ascii القياسي ، حيث يمكن العثور على أحرف التحكم ، التي يتم إدخالها في وحدة تحكم / كاذبة / vim عبر مفتاح CTRL (haha) ، هناك. في حين أن لغة C ومعظم اللغات الأخرى تستخدم عادةً الرموز الثمانية لتمثيل هذه "الأحرف".

إذا كنت تريد حقا أن تعرف من أين يأتي كل هذا: http://www.linusakesson.net/programming/tty/ .
هذا هو أفضل رابط ستواجهه حول هذا الموضوع ، لكن احذر: هناك تنانين.

TL، DR

عادةً foo = \n ، و bar = \r .


ها هي الخدعة:

أولاً ، قم بتعيين جلسة vi (m) الخاصة بك للسماح بمطابقة النمط مع الأحرف الخاصة (على سبيل المثال: newline). من الجدير وضع هذا السطر في ملف .vimrc أو .exrc الخاص بك.

:set magic

بعد ذلك ، قم بما يلي:

:s/,/,^M/g

للحصول على الحرف ^M ، اكتب Control - v واضغط على Enter . ضمن Windows ، قم بالتحكم - q ، أدخل . الطريقة الوحيدة التي أتذكر بها هذه الأشياء هي بتذكر مدى ضآلة الاحساس الذي يقومون به:

ج: ما هو أسوأ رمز تحكم لاستخدامه لتمثيل سطر جديد؟

ب: إما q (لأنه يعني عادة "إنهاء") أو v لأنه سيكون من السهل كتابة Control - c بطريق الخطأ وقتل المحرر.

ج: اجعلها كذلك.


هذا هو أفضل إجابة للطريقة التي أفكر بها ولكن كان سيكون أجمل في جدول: https://.com/a/12389839/962394 .

لذلك ، إعادة صياغة:

يجب استخدام \r لاستخدام سطر موجز (ascii 0x0a ، السطر الجديد unix) في استبدال regex ولكنه بديل للاستبدال - يجب أن تستمر عادةً في توقع استخدام \n لتغذية السطر و \r للعودة إلى السطر. .

ويرجع ذلك إلى استخدام vim \n في استبدال لتعني حرف NIL (ascii 0x00 ). ربما كنت تتوقع أن يكون \n بدلاً من ذلك ، مع تحرير \n لاستخدامه المعتاد لتغذية الخط ، ولكن \0 له بالفعل معنى في بدائل regex لذا تم نقله إلى \n . ومن ثم الذهاب إلى أبعد من ذلك أيضًا لتحويل الخط الجديد من \n إلى \r (وهو في نمط regex حرف الإرجاع ، ascii 0x0d ).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB: ^M (Ctrl-V Ctrl-M على linux) تدرج سطر جديد عند استخدامها في استبدال regex بدلاً من إرجاع carriage كما قد نصحت الآخرين (لقد حاولت فقط).

لاحظ أيضًا أن vim سيؤدي إلى كتابة رمز موجز الخط عندما يحفظ الملف استنادًا إلى إعدادات تنسيق الملف والذي قد يربك الأمور.


ولكن إذا كان على المرء أن يحل محل ثم يعمل الشيء التالي

:%s/\n/\r\|\-\r/g

في ما ورد أعلاه يتم استبدال كل سطر التالي مع السطر التالي ثم | - ومرة ​​أخرى في السطر التالي. هذا يستخدم في جداول الويكي. إذا كان النص كما يلي:

line1
line2
line3

يتم تغيير إلى

line1
|-
line2
|-
line3

يمكن القيام بعمل هنا نيابة عنك.





vi