سؤال

عندما أقوم بتشغيل برنامج نصي 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

منشور حول استبدال الأسطر الجديدة من سطر أوامر Unix

od -a $file من المفيد استكشاف هذه الأنواع من الأسئلة على Linux (على غرار dumphex في ما سبق).

في Perl، إذا كنت لا تريد تعيين المتغير $/ واستخدام chomp()، فيمكنك أيضًا القيام بما يلي:

$var =~ /\r\n//g;

سنتى

أمر vi آخر سيفي بالغرض: :%s/.$// يؤدي هذا إلى إزالة الحرف الأخير من كل سطر في الملف.العيب في أمر البحث والاستبدال هذا هو أنه لا يهتم بالحرف الأخير، لذا احرص على عدم الاتصال به مرتين.

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