سؤال
ما هو أبسط طريقة لإزالة جميع الإرجاع \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