سؤال

ما هو أبسط طريقة لإزالة جميع الإرجاع \r من ملف في Unix ؟

هل كانت مفيدة؟

المحلول

سأفترض أنك تقصد الإرجاع (CR, "\r", 0x0d) في ينتهي من خطوط بدلا من مجرد عمياء داخل ملف (قد يكون لهم في منتصف السلاسل لجميع أعلم).باستخدام هذا الاختبار الملف CR في نهاية السطر الأول فقط:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix هو الطريق للذهاب إذا كان مثبت على النظام الخاص بك:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

إذا كان لسبب ما dos2unix غير متاحة لك ، ثم sed سوف نفعل ذلك:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

إذا كان لسبب ما sed غير متاحة لك ، ثم ed وسوف نفعل ذلك في طريقة معقدة:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

إذا لم يكن لديك أي من تلك الأدوات المثبتة على المربع الخاص بك, لديك مشاكل أكبر في محاولة لتحويل الملفات :-)

نصائح أخرى

tr -d '\r' < infile > outfile

انظر tr(1)

المدرسة القديمة:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

هناك أداة تسمى dos2unix موجود في كثير من النظم ، و يمكن تركيبها بسهولة على الأكثر.

أبسط طريقة على لينكس هو في رأيي المتواضع ،

sed -i 's/\r$//g' <filename>

على ونقلت قوية حول استبدال المشغل 's/\r//' هي ضروري.بدونها قذيفة تفسير \r وهروب+r والحد منه عادي r, وإزالة حالة انخفاض جميع r.هذا هو السبب في الإجابة المذكورة أعلاه في عام 2009 من قبل روب لا تعمل.

و إضافة /g التعديل تضمن متعددة \r سيتم إزالة ليس فقط أول واحد.

sed -i s/\r// <filename> أو somesuch;انظر man sed أو ثروة من المعلومات المتاحة على شبكة الإنترنت بشأن استخدام sed.

شيء واحد أن نشير إلى المعنى الدقيق من "إرجاع" في أعلاه ؛ إذا كنت حقا تعني تحكم واحد حرف "إرجاع" ، فإن نمط أعلاه هو الصحيح.إذا كنت تعني أكثر عموما ، CRLF (إرجاع وخط تغذية ، وهو كيف خط يغذي تنفذ تحت ويندوز) ، ثم ربما كنت ترغب في استبدال \r\n بدلا من ذلك.العارية خط يغذي (السطر) في لينكس/يونكس هي \n.

إذا كنت السادس المستخدم قد فتح الملف وإزالة إرجاع مع:

:%s/\r//g

أو مع

:1,$ s/^M//

لاحظ أنه يجب كتابة ^M عن طريق الضغط على ctrl-v ثم ctrl-m.

مرة واحدة أكثر من حل...لأن هناك دائما أكثر واحد:

perl -i -pe 's/\r//' filename

انها لطيفة لأنه في المكان ويعمل في كل نكهة من يونكس/لينكس لقد عملت مع.

شخص آخر يوصي dos2unix وأنا أوصي بشدة كذلك.أنا فقط تقديم المزيد من التفاصيل.

إذا تم القفز إلى الخطوة التالية.إذا لم يكن مثبتا بالفعل, أنصح تثبيته عن طريق yum مثل:

yum install dos2unix

ثم يمكنك استخدامه مثل:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

هنا هو الشيء ،

%0d هو إرجاع الحرف.لجعله compatabile مع يونكس.نحن بحاجة إلى استخدام الأمر أدناه.

dos2unix fileName.extension fileName.extension

هذه محاولة لتحويل الملف dos إلى unix الملف:

fromdos الملف

إذا كنت تستخدم نظام التشغيل (مثل OS X) أن لا يكون dos2unix الأمر ولكن لا يكون مترجم بايثون (الإصدار 2.5+) ، وهذا الأمر هو ما يعادل dos2unix الأمر:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

هذا يتعامل مع كل تسمية الملفات على سطر الأوامر وكذلك أنابيب الموجهات مثل dos2unix.إذا قمت بإضافة هذا السطر إلى ~/.bashrc الملف (أو ما يعادلها ملف خاص عن قذائف أخرى):

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

...المرة القادمة التي تقوم فيها بتسجيل الدخول (أو تشغيل source ~/.bashrc في الدورة الحالية) سوف تكون قادرة على استخدام dos2unix اسم في سطر الأوامر في نفس الطريقة كما في الأمثلة الأخرى.

UNIX...لقد لاحظت dos2unix إزالة Unicode رؤوس شكل بلدي UTF-8 ملفات.تحت جيت باش (ويندوز) ، البرنامج النصي التالي يبدو للعمل بشكل جيد.ويستخدم sed.ملاحظة فقط يزيل النقل يعود في نهايات خطوط ويحافظ Unicode رؤوس.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

إذا كنت تقوم بتشغيل X البيئة المناسبة محرر (visual studio رمز), ثم أود أن اتبع ريككومينديشن:

Visual Studio كود:كيفية إظهار خط النهايات

فقط اذهب الى أسفل الشاشة على اليمين, visual studio الكود سوف تظهر لك كل من ترميز الملف و نهاية الخط الاتفاقية تليها الملف ، فقط بنقرة بسيطة يمكنك التبديل التي حولها.

مجرد استخدام رمز البصرية الخاصة بك استبدال المفكرة++ على بيئة لينكس و يتم تعيين لك أن تذهب.

لقد استعملت بيثون ، هنا رمز;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

رغم أنه الأكبر سنا آخر ، جئت مؤخرا عبر مع نفس المشكلة.كما كان لي كل الملفات التي تريد إعادة تسمية الداخل /tmp/blah_dir/ باسم كل ملف في هذا الدليل قد "/r" زائدة حرف ( عرض " ؟ " في نهاية الملف) حتى فعل ذلك السيناريو الطريقة فقط يمكن أن أفكر.

أردت حفظ الملف النهائي مع نفس الاسم (بدون زائدة أي حرف).مع sed, المشكلة إخراج الملف الذي كنت في حاجة إلى ذكر شيء آخر ( الذي لم أكن أريد).

حاولت خيارات أخرى كما اقترح هنا (لا يعتبر dos2unix بسبب بعض القيود) ولكن لم ينجح.

حاولت مع "أوك" أخيرا والتي عملت حيث كنت " " كما محدد و أخذ الجزء الأول:

الحيلة هي:

echo ${filename}|awk -F"\r" '{print $1}'

أدناه النصي مقتطف اعتدت ( حيث كان كل ملف كان " " زائدة حرف في المسار /tmp/blah_dir/) إصلاح المشكلة:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

ملاحظة: هذا المثال ليس في غاية الدقة على الرغم من قرب ما عملت (بالذكر هنا فقط لإعطاء فكرة أفضل عن ما فعلته)

يمكنك ببساطة القيام بذلك :

$ echo $(cat input) > output
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top