حرف '^M' في نهاية السطر
-
09-06-2019 - |
سؤال
عندما أقوم بتشغيل برنامج نصي SQL معين في بيئات Unix، أرى حرف "^M" في نهاية كل سطر من برنامج SQL النصي حيث يتم صدى ذلك في سطر الأوامر.لا أعرف على أي نظام تشغيل تم إنشاء برنامج SQL النصي في الأصل.
ما الذي يسبب هذا وكيف يمكنني إصلاحه؟
المحلول
يحدث ذلك بسبب أحرف نهاية سطر DOS/Windows.كما قال آندي ويتفيلد، سيساعد أمر Unix dos2unix في حل المشكلة.إذا كنت تريد المزيد من المعلومات، يمكنك قراءة صفحات الدليل لهذا الأمر.
نصائح أخرى
إصلاح نهايات الأسطر في vi
عن طريق تشغيل ما يلي:
:set fileformat=unix
:w
السبب هو الفرق بين كيفية قيام نظام التشغيل المستند إلى Windows ونظام التشغيل المستند إلى Unix بتخزين علامات نهاية السطر.
تقوم أنظمة التشغيل المستندة إلى Windows، بفضل تراث DOS الخاص بها، بتخزين نهاية السطر كزوج من الأحرف - 0x0D0A
(سطر الإرجاع + تغذية السطر).تستخدم أنظمة التشغيل المستندة إلى Unix فقط 0x0A
(أ سطر تغذية).ال ^M
الذي تراه هو تمثيل مرئي ل 0x0D
(أ إرجاع).
dos2unix سوف يساعد في هذا.ربما تحتاج أيضًا إلى ضبط مصدر البرامج النصية لتكون "متوافقة مع Unix".
أسهل طريقة هي الاستخدام vi
. أعلم أن هذا يبدو فظيعًا ولكن إنه بسيط ومثبت بالفعل على معظم بيئات UNIX.يعد ^M سطرًا جديدًا من بيئة Windows/DOS.
من موجه الأوامر: $ vi filename
ثم اضغط ":
"للوصول إلى وضع الأوامر.
بحث واستبدال كل شيء على مستوى العالم :%s/^M//g
"اضغط مع الاستمرار على السيطرة ثم اضغط على V ثم M" والذي سيحل محل ^M بلا شيء.
ثم للكتابة والخروج أدخل ":wq
" منتهي!
حاول استخدام dos2unix لإزالة ملف ^M.
في السادس، افعل :%s/^M//g
للحصول على ^M
امسك ال كنترول ضغط المفتاح الخامس ثم م (كلاهما أثناء الضغط على مفتاح التحكم) و ^M
سيظهر.سيبحث هذا عن جميع الأحداث ويستبدلها بلا شيء.
تم إنشاء البرنامج النصي SQL في الأصل على نظام التشغيل Windows.إن الأحرف '^M' هي نتيجة لاختلاف أفكار Windows وUnix حول ما يجب استخدامه لحرف نهاية السطر.يمكنك استخدام Perl في سطر الأوامر لإصلاح ذلك.
perl -pie 's/\r//g' filename.txt
عادةً ما يكون السبب في ^M هو الأسطر الجديدة لمشغل Windows، وتبدو ترجمتها إلى Unix مثل ^M.يجب أن يقوم الأمر dos2unix بإزالتها بشكل جيد
dos2unix [خيارات] [-c convmode] [-o file ...] [-n infile outfile ...]
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
Sed متاح على نطاق أوسع ويمكنه القيام بهذا النوع من الأشياء أيضًا إذا لم يتم تثبيت dos2unix
C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt
يمكنك أيضًا تجربة tr:
cat hello.txt | tr -d \r > helloUNIX2.txt
وهنا النتائج:
C:\tmp\text>dumphex hello.txt
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A ....haha..
C:\tmp\text>dumphex helloUNIX.txt
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..
00000010h: 68 61 68 61 0A haha.
C:\tmp\text>dumphex helloUNIX2.txt
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..
00000010h: 68 61 68 61 0A haha.
لاستبدال أحرف ^M في محرر vi استخدم أدناه
افتح الملف النصي مثل t1.txt
vi t1.txt
الدخول إلى وضع الأوامر بالضغط shift + :
ثم اضغط على المفاتيح كما ذكرنا %s/^M/\r/g
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
بديل ل dos2unix
سيكون الأمر باستخدام الأدوات المساعدة القياسية مثل sed
.
على سبيل المثال ، DOS to Unix:
sed 's/\r$//' dos.txt > unix.txt
يونيكس إلى دوس:
sed 's/$/\r/' unix.txt > dos.txt
يمكنك إزالة ^M من الملفات مباشرةً عبر الأمر sed، على سبيل المثال:
sed -i'.bak' s/\r//g *.*
إذا كنت راضيًا عن التغييرات، فقم بإزالة ملفات .bak:
rm -v *.bak
تحويل نهايات أسطر DOS/Windows ( ) إلى نهايات أسطر Unix ( )، باستخدام tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
od -a $file
من المفيد استكشاف هذه الأنواع من الأسئلة على Linux (على غرار dumphex في ما سبق).
في Perl، إذا كنت لا تريد تعيين المتغير $/ واستخدام chomp()، فيمكنك أيضًا القيام بما يلي:
$var =~ /\r\n//g;
سنتى
أمر vi آخر سيفي بالغرض: :%s/.$//
يؤدي هذا إلى إزالة الحرف الأخير من كل سطر في الملف.العيب في أمر البحث والاستبدال هذا هو أنه لا يهتم بالحرف الأخير، لذا احرص على عدم الاتصال به مرتين.