স্ট্রিংয়ের প্রথম শব্দটি কীভাবে পাবেন?


43

আমি যখন 'echo *' নিম্নলিখিত ফলাফলটি পাই:

file1 file2 file3 ...

আমি যা চাই তা প্রথম শব্দটি বেছে নেওয়া। আমি কীভাবে এগিয়ে যেতে পারি?


1
@mattdm lsযদি ফাইলের একটির শূন্যস্থান থাকে তবে ব্যবহার করা কার্যকর হবে না।
হেল্পারমেডোথ

2
আপনি কীভাবে শব্দ সংজ্ঞায়িত করবেন ? যদি প্রথম ফাইলটি হয় Sunset on a beach.jpgতবে এটি Sunsetবা পুরো ফাইলের নাম হওয়া উচিত ? কি হবে Sea, sex and sun.ogg? Sea, Sea,বা পুরো ফাইলের নাম?
স্টাফেন চেজেলাস

@ মেট্টেম ls | head -1আমাকে এলোমেলো জিনিস দেয় a.patch p.pyযা প্রথম শব্দ নয় এমনকি বর্ণমালা অনুসারে ফাইলও নয়।
ফুকলিভ

উত্তর:


52

আপনি এটিকে আঁকতে দিয়ে পাইপ করতে পারেন এবং এটি প্রথম শব্দের প্রতিধ্বনি করতে পারেন

echo * | head -n1 | awk '{print $1;}'

অথবা আপনি স্ট্রিংটি কেটে প্রথম শব্দটি নির্বাচন করুন:

echo *  | head -n1 | cut -d " " -f1

অথবা আপনি এটিকে বেঁধে দিয়েছেন এবং প্রথম শব্দটি বাদ দিয়ে সবকিছু মুছে ফেলতে পারেন

echo * | head -n1 | sed -e 's/\s.*$//'

| head -n1নিটপিকারদের সন্তুষ্ট করতে যোগ করা হয়েছে। আপনার স্ট্রিংয়ে নতুন | head -n1লাইনের উপস্থিতি থাকলে গুরুত্বপূর্ণ কমান্ডগুলি এতে লেখা স্ট্রিং থেকে প্রথম শব্দটি নির্বাচন করার আগে প্রথমে প্রথম লাইনটি নির্বাচন করবে।


1
এটি প্রতিটি লাইনের প্রথম শব্দটি ফিরে আসে, প্রথম শব্দ নয় word
স্টাফেন চেজেলাস

2
আমি ভাবছি কত লাইন echo *উত্পন্ন করে
বনাঙ্গুইন

এটা নির্ভর করে কিভাবে অনেক ফাইল তাদের নামটি দিয়ে বা পরিবেশ উপর নির্ভর করে বা কিভাবে ব্যাশ কম্পাইল বা কিনা কিছু ফাইল নামক সম্পর্কে newline অক্ষর আছে -eবা -ee... তালিকায় দেখা, কত সময় \nএকটি ফাইলের নাম প্রদর্শিত হবে। যদি কোনও ফাইল বলা হয় -n, তবে এটি কোনও লাইনও ফেরত আসতে পারে না ...
স্টাফেন চেজেলাস

ঠিক আছে, আমরা এখনও বাশ এবং ১ এর সাথে কথা বলছি usually সাধারণত বাশ নতুন লাইনের সাথে একটি স্ট্রিং হিসাবে নতুন লাইনের সাথে একটি স্ট্রিং পাস করবে না it's. এটি খুব শক্ত এবং অস্বাভাবিক (অসম্ভব?) ফাইলের নাম 3 এ একটি নতুন লাইন থাকা a একটি ফাইলের নাম \ n হিসাবে প্রদর্শিত হবে 3. 3 - 5 দিয়ে শুরু হওয়া ফাইলের নাম ধরে রাখবে - 5-এমনকি যখন -n বা -e ইকো দিয়ে ডাকা হবে তখন স্টাডাউটটি খুলবে এবং এটি সম্পন্ন হওয়ার পরে অবশ্যই এটি একটি লাইন ফিরে আসবে, এবং এ কমপক্ষে একটি স্ট্রিং, এই বিষয়টির জন্য i আমি কমপক্ষে
মাল্টলাইন

1
সমস্ত 5 পয়েন্ট মিথ্যা। একটি খালি dir চেষ্টা করুন: touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'( ইউনিক্স সঙ্গতিপূর্ণ প্রয়োজন xpg_echoযেখানেই সক্ষম করা bashহয়)। আর একজন খালি ডিরেক্টরির মধ্যে: touch ./-n; bash -c 'echo * | wc -l'। একটি রেখা একটি নতুন লাইন চরিত্র দ্বারা সমাপ্ত অক্ষরের ক্রম। যদি echoকোনও নিউলাইন চরিত্র আউটপুট না করে তবে এটি কোনও লাইন আউটপুট দেয় না। টেক্সট ইউটিলিটি আচরণ পছন্দ cut, awkবা sedঅনির্দিষ্ট হলে ইনপুট অতিরিক্ত অক্ষর গত newline অক্ষর এবং আচরণ পর বাস্তবায়নের জুড়ে পরিবর্তিত হয় হয়েছে।
স্টাফেন চেজেলাস

18

একটি পিক্সি শেল ( /bin/shবা এটি /bin/bashকরতে পারে) ধরে নেওয়া হচ্ছে

all=$(echo *)
first=${all%% *}

কনস্ট্রাক্ট সাবস্ট্রিং অপসারণের${all%% *} একটি উদাহরণ । মানে দীর্ঘতম ম্যাচ মুছতে পরিবর্তনশীল ডান শেষ থেকে (একটি স্থান কিছু থাকে) । আপনি এখানে স্ট্রিং ম্যানিপুলেশন সম্পর্কে আরও পড়তে পারেন ।%%*all

এই সমাধানটি ধরে নিয়েছে যে বিভাজক একটি স্থান। আপনি যদি ফাইলের নাম সহ এটি করে থাকেন তবে স্পেস সহ যে কোনও এটি ভেঙে দেবে।


সুন্দর. তবে আমি সাধারণ এবং আরও বেশি হ্যাকিযুক্ত অন্যান্য সংস্করণটি headএবংcut
আনোয়ার

4
আইএমও, হেড, কাট এবং সেড কম সহজ। যখন বিল্টিন প্যারামিটার প্রতিস্থাপন কাজটি দক্ষতার সাথে করে তখন অন্য একটি সরঞ্জাম কেন স্প্যান করে। এই উত্তরটি স্থান-বিচ্ছিন্ন শব্দের তালিকার প্রথম শব্দটি বেছে নেওয়ার সর্বাধিক দক্ষ এবং সর্বাধিক বহনযোগ্য উপায় (যা সমস্ত ওপি-র কাছে জিজ্ঞাসা করা হয়েছে)।
জুয়ান

7

ধরে নিই যে আপনি সত্যিই প্রথম ফাইলের নাম চান এবং প্রথম শব্দটি নয় , এখানে এমন একটি উপায় রয়েছে যা শ্বেত স্পেসে ভাঙবে না:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"

1
প্রথম শব্দটি খুব সহজ হবে:files=($(echo *))
হউক লেগেছে

2
এটি "-n", "-e", "-ne", "-Eenenene" ... এবং কীভাবে bashসংকলন করা হয়েছিল বা পরিবেশ, সম্ভবত ব্যাকস্ল্যাশ অক্ষরগুলির উপর নির্ভর করে break
স্টাফেন চেজেলাস

2
@ হককিজিং, আপনাকে গ্লোব্বিং নিষ্ক্রিয় করতে হবে। পছন্দ: text=$(echo *); set -f; files=($text)অন্যথায় আরও ওয়াইল্ডকার্ড প্রসারিত হতে পারে।
স্টাফেন চেজেলাস

3
এবংfiles=$(echo *); echo ${files%% *}
vdegenne

1
@ মেমনচ_প্রক্সি এটি হোয়াইটস্পেসযুক্ত ফাইলের নাম ভাঙবে, সাবধানতার সাথে এটি ব্যবহার করবে।
ক্রিস ডাউন

5

আপনি অবস্থানগত পরামিতি ব্যবহার করতে পারেন

set -- *
echo "$1"

3
সাবধান থাকুন যে এটি আপনার স্ক্রিপ্টে অন্য কোনও যুক্তি নষ্ট করে দেবে, যদি না একটি সহায়ক স্কোপে চালিত হয়। *ডিরেক্টরিতে কোনও ফাইল না থাকলে এটিও প্রসারিত হবে ।
ক্রিস ডাউন

shopt -s nullglobএটি হ্যান্ডেল করবে
গ্লেন জ্যাকম্যান

3

নিম্নলিখিত বিকল্পগুলির মধ্যে একটি চেক করুন:

$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)

তারপরে আপনি এটি মাধ্যমে মুদ্রণ করতে পারেন echo $FILE

আরও দেখুন: grepআউটপুট থেকে একমাত্র প্রথম শব্দ?



1

পুরো প্রথম ফাইলের নাম পাওয়া:

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.