كيفية اكتشاف انتهاء الملف في السطر الجديد؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

في أكثر من هل يمكنك تعديل الملفات النصية عند الالتزام بالتخريب؟ منحة اقترح أن أقوم بحظر الالتزامات بدلاً من ذلك.

ومع ذلك لا أعرف كيفية التحقق من انتهاء الملف بسطر جديد.كيف يمكنك اكتشاف أن الملف ينتهي بسطر جديد؟

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

المحلول

@ كونراد:الذيل لا يُرجع سطرًا فارغًا.لقد قمت بإنشاء ملف يحتوي على بعض النصوص التي لا تنتهي بالسطر الجديد وملفًا ينتهي بذلك.هنا هو الإخراج من الذيل:

$ cat test_no_newline.txt
this file doesn't end in newline$ 

$ cat test_with_newline.txt
this file ends in newline
$

على الرغم من أنني وجدت أن الذيل قد حصل على خيار البايت الأخير.لذلك قمت بتعديل البرنامج النصي الخاص بك إلى:

#!/bin/sh
c=`tail -c 1 $1`
if [ "$c" != "" ]; then echo "no newline"; fi

نصائح أخرى

أو حتى أبسط:

#!/bin/sh
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'"

ولكن إذا كنت تريد فحصًا أكثر قوة:

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'"

إليك وظيفة باش مفيدة:

function file_ends_with_newline() {
    [[ $(tail -c1 "$1" | wc -l) -gt 0 ]]
}

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

if ! file_ends_with_newline myfile.txt
then
    echo "" >> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline

يمكنك استخدام شيء مثل هذا كبرنامج نصي للالتزام المسبق:

#! /usr/bin/perl

while (<>) {
    $last = $_;
}

if (! ($last =~ m/\n$/)) {
    print STDERR "File doesn't end with \\n!\n";
    exit 1;
}

عملت بالنسبة لي:

tail -n 1 /path/to/newline_at_end.txt | wc --lines
# according to "man wc" : --lines - print the newline counts

لذا، يحسب wc عدد أحرف السطر الجديد، وهو أمر جيد في حالتنا.يطبع الخط الواحد إما 0 أو 1 وفقًا لوجود السطر الجديد في نهاية الملف.

باستخدام فقط bash:

x=`tail -n 1 your_textfile`
if [ "$x" == "" ]; then echo "empty line"; fi

(احرص على نسخ المسافات البيضاء بشكل صحيح!)

@جروم:

الذيل لا يُرجع سطرًا فارغًا

اللعنة.ملف الاختبار الخاص بي لم ينتهِ \n ولكن على \n\n.فيما يبدو vim لا يمكن إنشاء ملفات لا تنتهي عند \n (؟).على أية حال، طالما أن خيار "الحصول على البايت الأخير" يعمل، فكل شيء على ما يرام.

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