في bash ، كيف أحسب عدد الخطوط في متغير؟



string (5)

الإجابة المقبولة والإجابات الأخرى المنشورة هنا لا تعمل في حالة وجود متغير فارغ (سلسلة غير محددة أو فارغة).

هذا يعمل:

echo -n "$VARIABLE" | grep -c '^'

فمثلا:

ZERO=
ONE="just one line"
TWO="first
> second"

echo -n "$ZERO" | grep -c '^'
0
echo -n "$ONE" | grep -c '^'
1
echo -n "$TWO" | grep -c '^'
2

https://src-bin.com

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

var=`ls "$sdir" | grep "$input"`

شبة الكود:

while [ ! $var's number of lines -eq 1 ]
  do something

هذا هو فكرتي حول كيفية التحقق ، echo $var | wc -l echo $var | wc -l لا يعمل ، يقول دائمًا 1 على الرغم من أنه يحتوي على 3

لا يعمل echo -e


Answer #1

تفشل الإجابات التي تم التصويت عليها في الأعلى إذا لم يتم إرجاع أي نتائج بواسطة grep.

Homer Simpson
Marge Simpson
Bart Simpson
Lisa Simpson
Ned Flanders
Rod Flanders
Todd Flanders
Moe Szyslak

هذه هي الطريقة الخاطئة للقيام بذلك :

wiggums=$(grep -iF "Wiggum" characters.txt);
num_wiggums=$(echo "$wiggums" | wc -l);
echo "There are ${num_wiggums} here!";

هناك سوف يخبرنا ، هناك 1 Wiggum في القائمة ، حتى لو لم يكن هناك.

بدلاً من ذلك ، يلزمك إجراء فحص إضافي واحد لمعرفة ما إذا كان المتغير فارغًا ( -z ، كما في "صفر"). إذا لم يُرجع grep أي شيء ، فسيكون المتغير فارغًا.

matches=$(grep -iF "VanHouten" characters.txt);

if [ -z "$matches" ]; then
    num_matches=0;
else
    num_matches=$(echo "$matches" | wc -l);
fi

echo "There are ${num_matches} VanHoutens on the list";

Answer #2

نسخة أبسط من إجابة @ Julian ، والتي تعمل مع جميع السلاسل ، مع أو بدون زائدة \ n (إنها تحسب ملفًا يحتوي على زائدة واحدة \ n كخلفية فارغة):

printf "%s" "$a" | grep -c "^"

  • إرجاع صفر: متغير unset ، سلسلة فارغة ، سلسلة تحتوي على السطر الجديد العاري
  • إرجاع 1: أي خط غير فارغ ، مع أو بدون زائدة السطر الجديد
  • إلخ

انتاج:

# a=
# printf "%s" "$a" | grep -c "^"
0

# a=""
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "\n")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf " \n")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf " ")"
# printf "%s" "$a" | grep -c "^"
1

# a="aaa"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n%s" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2

# a="$(printf "%s\n%s\n" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2

Answer #3

هناك طريقة أخرى تستخدم هنا السلاسل في bash:

wc -l <<< "$var"

كما هو مذكور في هذا التعليق ، سيؤدي $var الفارغ إلى سطر واحد بدلاً من سطر واحد لأن السلاسل هنا تضيف حرف سطر جديد في هذه الحالة ( explanation ).


Answer #4

يمكنك استبدال "wc -l" بـ "wc-w" لحساب عدد الكلمات بدلاً من الأسطر. لن يحسب هذا أي خطوط جديدة ويمكن استخدامه لاختبار ما إذا كانت النتائج الأصلية فارغة قبل المتابعة.





string