উত্তর:
হোয়াইটস্পেসের জন্য যদি আপনাকে পশ্চাদপসরণের মুখোমুখি হতে হয় তবে অজ হ'ল একটি ভাল বিকল্প কারণ এটি এটি আপনার যত্ন নেবে:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
কাট যদিও এটি যত্ন নেবে না:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
এখানে 'কাটা' কোনও কিছুই / সাদা স্থান মুদ্রণ করে না, কারণ কোনও জায়গার আগে প্রথম জিনিসটি ছিল আরেকটি স্থান।
-F","কমা দিয়ে ডিফল্ট ক্ষেত্র বিভাজক (একটি স্থান) ওভাররাইড করতে পারেন ।
বাহ্যিক কমান্ড ব্যবহার করার দরকার নেই। বাশ নিজেই কাজটি করতে পারে। "ওয়ার্ড 1 ওয়ার্ড 2" ধরে ধরে আপনি কোথাও থেকে এসেছেন এবং ভেরিয়েবলে সংরক্ষণ করেছেন, যেমন
$ string="word1 word2"
$ set -- $string
$ echo $1
word1
$ echo $2
word2
আপনি যদি চান তবে এখন আপনি অন্য ভেরিয়েবলের জন্য $ 1, বা $ 2 ইত্যাদি নির্ধারণ করতে পারেন।
stdin। @ ম্যাট এম এর --অর্থ হল stdin, তাই $stringহিসাবে পাস করা হচ্ছে stdin। stdinআর্গুমেন্ট মধ্যে হোয়াইটস্পেস বিভাজিত হয় $1, $2, $3, ইত্যাদি - শুধু একটি ব্যাশ প্রোগ্রাম মূল্যায়ন আর্গুমেন্ট (যেমন চেক মত $1, $2ইত্যাদি), এই পদ্ধতির সুবিধা শেল এর প্রবণতা বিভক্ত লাগে stdinআর্গুমেন্ট মধ্যে স্বয়ংক্রিয়ভাবে সরানোর প্রয়োজনে awkবা cut।
setশেল আর্গুমেন্ট সেট করে।
word1=$(IFS=" " ; set -- $string ; echo $1)শব্দের মধ্যে স্থানটি সঠিকভাবে সনাক্ত করতে আইএফএস সেট করুন। He 1 এর মূল বিষয়বস্তু আঁকড়ে না এড়াতে বন্ধনীগুলিতে মোড়ানো।
string="*"। আশ্চর্য.
আমি মনে করি একটি কার্যকর উপায় হ'ল বাশ অ্যারে ব্যবহার:
array=( $string ) # do not use quotes in order to allow word expansion
echo ${array[0]} # You can retrieve any word. Index runs from 0 to length-1
এছাড়াও, আপনি সরাসরি পাইপ-লাইনে অ্যারে পড়তে পারেন:
echo "word1 word2" | while read -a array; do echo "${array[0]}" ; done
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"। আশ্চর্য.
whileপ্রতিটি লাইনে প্রতিটি প্রথম শব্দ পুনরুদ্ধার করতে সিনট্যাক্সটি ব্যবহার করুন । অন্যথায়, Boontawee হোম পদ্ধতির ব্যবহার করুন। এছাড়াও, দয়া করে নোট করুন যে echo "${array[0]}"gniourf-gniourf দ্বারা যেমনটি লক্ষ্য করা গেছে তেমন বিস্তার রোধ করতে উদ্ধৃতি দেওয়া হয়েছে।
echo "word1 word2 word3" | { read first rest ; echo $first ; }
এটির সুবিধাটি রয়েছে যা বাহ্যিক কমান্ড ব্যবহার করছে না এবং $ 1, $ 2 ইত্যাদি পরিবর্তনশীল অক্ষত।
$1, $2, …স্ক্রিপ্ট রচনার জন্য ভেরিয়েবল অক্ষত রেখে দেওয়া একটি অত্যন্ত কার্যকর বৈশিষ্ট্য!
যদি আপনি নিশ্চিত হন যে কোনও শীর্ষস্থানীয় স্থান নেই, আপনি ব্যাশ প্যারামিটার বিকল্প ব্যবহার করতে পারেন:
$ string="word1 word2"
$ echo ${string/%\ */}
word1
একক স্থান থেকে পালানোর জন্য সতর্কতা অবলম্বন করুন। প্রতিস্থাপনের নিদর্শনগুলির আরও উদাহরণের জন্য এখানে দেখুন । আপনার যদি বাশ> 3.0.০ থাকে তবে আপনি নেতৃস্থানীয় স্পেসগুলি মোকাবেলায় নিয়মিত প্রকাশের মিলও ব্যবহার করতে পারেন - এখানে দেখুন :
$ string=" word1 word2"
$ [[ ${string} =~ \ *([^\ ]*) ]]
$ echo ${BASH_REMATCH[1]}
word1
%% *শেল প্যারামিটার সম্প্রসারণ ব্যবহার করে এখানে আরও একটি সমাধান দেওয়া হয়েছে । এটি প্রথম শব্দের পরে একাধিক স্পেসের যত্ন নেয়। প্রথম শব্দের সামনে স্পেস পরিচালনা করার জন্য আরও একটি অতিরিক্ত প্রসারণ প্রয়োজন।
string='word1 word2'
echo ${string%% *}
word1
string='word1 word2 '
echo ${string%% *}
word1
%%প্রকাশ করে মুছে ফেলার দীর্ঘতম সম্ভব ম্যাচ *(a স্থান যাই হোক না কেন অন্য অক্ষর যে কোন সংখ্যার থাকে) চিহ্ন অংশ string।
আমি ভাবলাম যে শীর্ষের বেশ কয়েকটি উত্তর গতির ক্ষেত্রে কীভাবে পরিমাপ করেছে। আমি নিম্নলিখিতটি পরীক্ষা করেছি:
1 @ ম্যাটটিভ এর
echo "..." | awk '{print $1;}'
2 @ ঘোস্টডোগ 74 এর
string="..."; set -- $string; echo $1
3 @ বুন্টাওয়ে-হোম
echo "..." | { read -a array ; echo ${array[0]} ; }
এবং 4 @ বুন্টাওয়ে-হোমস
echo "..." | { read first _ ; echo $first ; }
আমি 215 5-অক্ষরের শব্দের সাথে একটি পরীক্ষার স্ট্রিং ব্যবহার করে ম্যাকোস-এর একটি জেডএস টার্মিনালে বাশ স্ক্রিপ্টে পাইথনের টাইমিট দিয়ে তাদের পরিমাপ করেছি। প্রতিটি পরিমাপ পাঁচবার হয়েছে (ফলাফলগুলি ছিল 100 লুপের জন্য, 3 টির মধ্যে সেরা) এবং ফলাফলগুলি গড়:
method time
--------------------------------
1. awk 9.2ms
2. set 11.6ms (1.26 * "1")
3. read -a 11.7ms (1.27 * "1")
4. read 13.6ms (1.48 * "1")
চমৎকার কাজ, ভোটাররা 👏 ভোট (এই লেখার মতো) সমাধানগুলির গতির সাথে মেলে!
read -aড্যাশটিতে অবৈধ)।
echo "word1 word2" | cut -f 1 -d " "
কাটা স্ট্রিং "" (-d "") দ্বারা সীমানাঙ্কিত ক্ষেত্রগুলির তালিকা থেকে প্রথম ক্ষেত্রের (-f 1) কেটে দেয়
read তোমার বন্ধু:
স্ট্রিং যদি কোনও ভেরিয়েবলে থাকে:
string="word1 word2"
read -r first _ <<< "$string"
printf '%s\n' "$first"আপনি যদি পাইপে কাজ করছেন: প্রথম ক্ষেত্রে: আপনি কেবল প্রথম লাইনের প্রথম শব্দটি চান:
printf '%s\n' "word1 word2" "line2" | { read -r first _; printf '%s\n' "$first"; }
দ্বিতীয় কেস: আপনি প্রতিটি লাইনের প্রথম শব্দটি চান:
printf '%s\n' "word1 word2" "worda wordb" | while read -r first _; do printf '%s\n' "$first"; doneশীর্ষস্থানীয় স্থান থাকলে এই কাজগুলি:
printf '%s\n' " word1 word2" | { read -r first _; printf '%s\n' "$first"; }
আমি একটি এমবেডেড ডিভাইস নিয়ে কাজ করছিলাম যার পার্ল, অ্যাজক বা পাইথন ছিল না এবং পরিবর্তে সেড দিয়ে এটি করেছি। এটি প্রথম শব্দের আগে একাধিক স্পেস সমর্থন করে (যা cutএবং bashসমাধানগুলি পরিচালনা করে না)।
VARIABLE=" first_word_with_spaces_before_and_after another_word "
echo $VARIABLE | sed 's/ *\([^ ]*\).*/\1/'
psপ্রক্রিয়া আইডির জন্য গ্রেপিংয়ের সময় এটি খুব কার্যকর ছিল যেহেতু কেবলমাত্র ব্যাশ ব্যবহার করে এখানে অন্যান্য সমাধানগুলি psসারিবদ্ধ করার জন্য ব্যবহৃত প্রথম স্থান সরাতে সক্ষম হয় নি ।