কোনও ভেরিয়েবলের বাশে একাধিক নন-ফাঁকা লাইন রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?


10

বলুন আমার বাশে দুটি পরিবর্তনশীল রয়েছে:

MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"

আমি যখন ভেরিয়েবলটিতে অতিরিক্ত ট্রেলিং নিউলাইন অক্ষরগুলিকে উপেক্ষা করে প্রকৃতপক্ষে একাধিক লাইনের পাঠ থাকে তখন আমি সনাক্ত করতে চাই।

আমার স্নাতকের:

if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi

মুদ্রণ করতে হবে yes, এবং এই:

if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi

মুদ্রণ হবে no

আমার সুনির্দিষ্ট ক্ষেত্রে, আমি মনে করি না যে খালি রেখাগুলির শীর্ষস্থানীয় হওয়া নিয়ে আমার চিন্তা করা দরকার, তবে কীভাবে এটি করা উচিত তা জানার ক্ষতি হবে না।

কিভাবে আমি এটি করতে পারব?



@ ক্রোও আপনাকে ধন্যবাদ, তবে আপনি কি সেখানে নির্দিষ্ট উত্তরগুলিতে ইঙ্গিত করতে পারেন যা ফাঁকা ফাঁকা রেখা অগ্রাহ্য করে? আমি কিছু দেখিনি। (তদনুযায়ী শিরোনামও সম্পাদনা করেছেন))
jpmc26

উত্তর:


5

আমার জানা সবচেয়ে সহজ সমাধানটি হ'ল:

if (( $(grep -c . <<<"$MULTILINE") > 1 ))

উদাহরণ:

VAR="a
b"
if (( $(grep -c . <<<"$VAR") > 1 )); then
  echo VAR has more than one line
else
  echo VAR has at most one line
fi

==>

VAR has more than one line

উপরেরগুলি সমস্ত ফাঁকা রেখা উপেক্ষা করে: নেতৃস্থানীয়, পিছনে এবং অভ্যন্তর। তবে মনে রাখবেন যে কমপক্ষে দুটি নন-ফাঁকা লাইন না থাকলে অভ্যন্তরীণ ফাঁকা লাইন থাকা সম্ভব নয়, সুতরাং এর অস্তিত্ব নেতৃস্থানীয় এবং অনুসরণকারী ফাঁকা রেখাগুলি ছাঁটাইয়ের পরে একাধিক লাইন রয়েছে কিনা তা নিয়ে প্রশ্নটি পরিবর্তন করতে পারে না।


5
$ প্রতিধ্বনি "UL মাল্টলাইন" | wc -l
2

$ প্রতিধ্বনি "$ SINGLE_LINE" | wc -l
2

$ প্রতিধ্বনি "$ SINGLE_LINE" | সেড -রে '/ ^ $ / ডি' | wc -l
1

$ প্রতিধ্বনি "UL মাল্টলাইন" | সেড -রে '/ ^ $ / ডি' | wc -l
2

শুকনো স্পেস এবং খালি লাইনগুলি সেড ব্যবহার করে কীভাবে ছাঁটা / মুছতে হবে তার সম্পর্কে আরও জানতে /programming/16414410/delete-empty-lines-used-sed দেখুন

আপনার রেখার সংখ্যা পেতে কোটরের অভ্যন্তরে আপনার if expression ...ব্যবহার লিখতে $( ... ), এবং সংখ্যার বিপরীতে পরীক্ষা করতে:

যদি ["$ (প্রতিধ্বনি" $ মাল্টলাইন "| সেড -re '/ ^ $ / d' | ডাব্লুসিএল-এল)" -জিটি 1]; তারপর
  প্রতিধ্বনি 'একাধিক লাইন'; 
আর 
  প্রতিধ্বনি 'একক বা কোন রেখা'; 
ফাই

0

একটি সামান্য পরিমার্জন এই কোড এটা করতে হবে। আপনি এটির পুনরায় পুনঃব্যবহারের জন্য এটি নিজস্ব স্ক্রিপ্টে রাখতে পারেন:

#!/bin/bash
nlhit=""
for (( i=0; i<${#1}; i++ )); do
    if [[ "${1:$i:1}" == $'\n' ]]; then
        nlhit="1"
    elif [[ "$nlhit" == "1" ]]; then
        exit 1
    fi
done

exit 0

তারপরে আপনি এটি এর মতো ব্যবহার করতে পারেন (ধরে নিবেন যে আপনি আগের স্ক্রিপ্টটির নাম দিয়েছেন multiline-check.sh):

#!/bin/bash

EMPTYLINE=""
BLANKLINE="    "
ONLYLINES="


"

MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
SECOND_LINE="
I begin with a newline"


echo -n "EMPTYLINE Check: "
multiline-check.sh "$EMPTYLINE"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

echo -n "BLANKLINE Check: "
multiline-check.sh "$BLANKLINE"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

echo -n "ONLYLINES Check: "
multiline-check.sh "$ONLYLINES"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

echo -n "MULTILINE Check: "
multiline-check.sh "$MULTILINE"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

echo -n "SINGLE_LINE Check: "
multiline-check.sh "$SINGLE_LINE"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

echo -n "SECOND_LINE Check: "
multiline-check.sh "$SECOND_LINE"
if [ $? -eq 1 ]; then echo "Yes"; else echo "No"; fi

আমি প্রথমটিতে একটি সিনট্যাক্স ত্রুটি পাচ্ছি fi। দুর্ভাগ্যক্রমে, আমি বাশ ৩.১ (এমএসএসজিট সংস্করণ) এ আটকে আছি। আমি আমার কাছে সিনট্যাক্স ত্রুটির মতো দেখতে এমন কিছু দেখতে পাচ্ছি না, তবে স্পষ্টতই আমি কিছু মিস করছি। থটস?
jpmc26

@ jpmc26 এটির একটি ত্রুটি ছিল। আমি এটিকে বাহ্যিক স্ক্রিপ্ট হিসাবে আপডেট করেছি যাতে এটি ব্যবহার করা আরও সহজ হয়।
ক্রো

@ jpmc26 অন্যান্য বিজোড় ইনপুট পরীক্ষা করতে আমি আরও কিছু চেক যুক্ত করেছি।
ক্রোয়ে

0

ফাঁকা ফাঁকা রেখাগুলি অগ্রাহ্য করা

এখানে একটি পন্থা ব্যবহার করে দেখুন awk:

echo "$TEST" | tac | awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }' && echo "Found A Single Line"

কিভাবে এটা কাজ করে:

  • প্রতিধ্বনি "E পরীক্ষা"

    এটিতে আমরা আগ্রহী শেল ভেরিয়েবলটি গ্রহণ করে এবং এটি স্ট্যান্ডার্ড আউট প্রেরণ করে।

  • tac

    এটি লাইনের ক্রমটিকে বিপরীত করে যাতে শেষ লাইনটি প্রথমে ফিরে আসে। মৃত্যুদন্ড কার্যকর করার পরে tac, অনুসরণকারী রেখাগুলি নেতৃস্থানীয় রেখাগুলিতে পরিণত হয়।

    (নামটি tacবিপরীতক্রমে catযা tacকরে তা catকরে এমন কারণে বিপরীত)

  • awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'

    এটি ভেরিয়েবলের প্রথম নন-ফাঁকা লাইনের লাইন নম্বর সংরক্ষণ করে f। সমস্ত লাইনে পড়ার পরে fএটি মোট লাইনের সংখ্যার সাথে তুলনা করে NR,। যদি fএটির সমান হয় NR, তবে আমাদের কেবল একটি একক লাইন ছিল (প্রাথমিক ফাঁকাগুলি উপেক্ষা করে) এবং আমরা কোড 0 দিয়ে প্রস্থান করব যদি প্রথম ফাঁকা লাইনের পরে যদি এক বা একাধিক লাইন থাকে তবে তা কোড `সহ প্রস্থান করে`

  • && echo "Found A Single Line"

    যদি awkকোড 0 দিয়ে উপস্থিত থাকে তবে echoবিবৃতি কার্যকর করা হবে।

নেতৃস্থানীয় এবং পিছনে ফাঁকা রেখা উভয় উপেক্ষা করা

একটি অতিরিক্ত awkভেরিয়েবল তৈরি করে , আমরা উভয় নেতৃস্থানীয় এবং অনুসরণকারী ফাঁকা লাইন উপেক্ষা করার জন্য পরীক্ষাটি প্রসারিত করতে পারি:

echo "$TEST" | awk 'first==0 && /./ {first=NR} /./ {last=NR} END{if(first==last){exit 0}; exit 1 }' && echo " Found A Single Line"

কারণ কোডটির এই সংস্করণটি awkনেতৃস্থানীয় এবং অনুসরণকারী ফাঁকা উভয় ক্ষেত্রেই পরিচালনা করে, tacএখন আর দরকার নেই।

টেকিং awkকোড একটি সময়ে এক টুকরা:

  • first==0 && /./ {first=NR}

    যদি ভেরিয়েবলটি firstশূন্য হয় (বা এটি এখনও সেট করা হয়নি) এবং লাইনের একটি অক্ষর, কোনও অক্ষর থাকে firstতবে লাইন নম্বরতে সেট করুন । যখন awkলাইন পড়া সম্পন্ন হলে, firstপ্রথম অ ফাঁকা লাইন লাইন নম্বরে সেট করা হবে।

  • /./ {last=NR}

    যদি রেখার কোনও অক্ষর থাকে তবে lastবর্তমান লাইন নম্বরটিতে ভেরিয়েবলটি সেট করুন । যখন awkসব লাইন পড়া সম্পন্ন করা হয়, এই পরিবর্তনশীল ইচ্ছা গত অ ফাঁকা লাইন লাইন নম্বর আছে।

  • END{if(first==last){exit 0}; exit 1 }

    সমস্ত লাইন পড়ার পরে এটি কার্যকর করা হয়েছে। যদি firstএর সমান হয় last, তবে আমরা শূন্য বা লাইন নন-ফাঁকা লাইন দেখেছি এবং awkকোড সহ প্রস্থান করি 0। অন্যথায়, এটি কোড সহ প্রস্থান করে 1। শেল স্ক্রিপ্ট ifস্টেটমেন্ট বা &&বা এর মাধ্যমে যথারীতি প্রস্থান কোডটি পরীক্ষা করতে পারে ||

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.