كيف تبحث عن الملفات التي تحتوي على نهايات سطر dos (CRLF) مع grep على Linux؟

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

سؤال

أريد البحث عن الملفات التي تحتوي على نهايات سطر dos مع grep على Linux.شيء من هذا القبيل:

grep -IUr --color '\r\n' .

يبدو أن ما ورد أعلاه يتطابق مع الحرفي rn وهو ليس ما هو مرغوب فيه.

سيتم إرسال مخرجات هذا عبر xargs إلى todos لتحويل crlf إلى lf مثل هذا

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
هل كانت مفيدة؟

المحلول

يستخدم كنترول+الخامس, كنترول+م لإدخال حرف Carriage Return الحرفي في سلسلة grep الخاصة بك.لذا:

grep -IUr --color "^M"

ستعمل - إذا كان ^M هناك سجل تجاري حرفي تقوم بإدخاله كما اقترحت.

إذا كنت تريد قائمة الملفات، فأنت تريد إضافة ملف -l الخيار كذلك.

توضيح

  • -I تجاهل الملفات الثنائية
  • -U يمنع grep لتجريد أحرف CR.افتراضيًا، سيفعل ذلك إذا قرر أنه ملف نصي.
  • -r قراءة كافة الملفات ضمن كل دليل بشكل متكرر.

نصائح أخرى

ربما لا تكون grep هي الأداة التي تريدها لهذا الغرض.سيتم طباعة سطر لكل سطر مطابق في كل ملف.ما لم تكن ترغب، على سبيل المثال، في تشغيل جميع المهام 10 مرات في ملف مكون من 10 أسطر، فإن grep ليس أفضل طريقة للقيام بذلك.استخدام البحث لتشغيل الملف على كل ملف في الشجرة، ثم التنقل عبر ذلك لـ "CRLF" سيوفر لك سطرًا واحدًا من الإخراج لكل ملف له نهايات سطر نمط dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

سوف تحصل على شيء مثل:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators

إذا كان إصدار grep الخاص بك يدعم -P (--بيرل-regexp) الخيار إذن

grep -lUP '\r$'

يمكن ان تستعمل.

# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative

السؤال كان بحث...عندى نفس المشكلة...قام شخص ما بتقديم نهايات خط مختلط إلى عنصر تحكم الإصدار ، لذا لدينا الآن مجموعة من الملفات 0x0d 0x0d 0x0a نهايات الخط.لاحظ أن

grep -P '\x0d\x0a'

يجد كافة الخطوط، في حين

grep -P '\x0d\x0d\x0a'

و

grep -P '\x0d\x0d'

لا يجد أي خطوط لذلك قد يكون هناك شيء "آخر" يحدث داخل GREP عندما يتعلق الأمر بأنماط إنهاء الخط ...لسوء الحظ بالنسبة لي!

إذا، مثلي، نظام يونكس البسيط الخاص بك لا يتضمن تفاصيل جميلة مثل ملف الأمر، والخطوط المائلة العكسية في الخاص بك grep التعبيرات لا تتعاون، جرب هذا:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

تتضمن التعديلات التي قد ترغب في إجرائها على ما ورد أعلاه ما يلي:

  • قرص يجد أمر لتحديد موقع الملفات التي تريد فحصها فقط
  • غير ال أحمق أمر ل التطوير التنظيمي أو أي أداة تفريغ ملفات لديك
  • تأكيد أن يقطع يتضمن الأمر مسافة بادئة وزائدة بالإضافة إلى إخراج الأحرف السداسية العشرية فقط من الملف أحمق جدوى
  • الحد من أحمق الإخراج إلى أول 1000 حرف أو نحو ذلك لتحقيق الكفاءة

على سبيل المثال، شيء من هذا القبيل قد يصلح لك باستخدام التطوير التنظيمي بدلاً من أحمق:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'

يمكنك استخدام أمر الملف في يونكس.فهو يوفر لك ترميز الأحرف للملف مع إنهاء الأسطر.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top