উত্তর:
প্রথম বিকল্পটির মতোই তবে পেছনের ডিলিমিটার বাদ দেয়
ls -1 | paste -sd "," -
paste
পায় -
, অন্তত আমার উপর paste (GNU coreutils) 8.22
।
"\0"
, তাই paste -sd "\0" -
আমার জন্য কাজ করেছে!
সম্পাদনা : সহজভাবে " ls -m " আপনি যদি চান আপনার ডিলিমেটারকে কমা হতে
আহ, শক্তি এবং সরলতা!
ls -1 | tr '\n' ','
কমা পরিবর্তন করুন " , " আপনি যা চান তেমন করুন। দ্রষ্টব্য যে এটিতে একটি "ট্রেলিং কমা" রয়েছে
\n
মধ্যে এটি থাকে তবে এটি এটিও প্রতিস্থাপন করবে।
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
শেষ-চিহ্নিতকারী চরিত্রটির সাথে আপনার কিছুটা দক্ষ হতে পারে:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
পরে tr
শেষ চিহ্নটি অপসারণ করার জন্য ব্যবহার করা অযৌক্তিক বলে মনে হয়। আমি সাথে যাইls -1 | tr '\n' ',' | head -c -1
এটি একটি নতুন লাইনের সাথে শেষ কমাটি প্রতিস্থাপন করে:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
স্ক্রিন-প্রস্থের অক্ষরে নতুন লাইনের অন্তর্ভুক্ত রয়েছে (উদাহরণস্বরূপ 80 তম)।
বেশিরভাগ বাশ (কেবলমাত্র ls
বাহ্যিক):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
বাশ 4 এ readarray
(ওরফে mapfile
) ব্যবহার করা :
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
পরামর্শের জন্য gniourf_gniourf ধন্যবাদ।
mapfile
হিসাবে (ব্যাশ ≥4): mapfile -t files < <(ls -1)
। সাথে ঝাঁকুনির দরকার নেই IFS
। এবং এটি খুব ছোট।
IFS
ক্ষেত্র যোগদানের জন্য: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
। অথবা আপনি যদি আরও একটি চরিত্রের সাথে আলাদা করতে চান তবে অন্য পদ্ধতিটি ব্যবহার করুন।
আমি মনে করি এটি দুর্দান্ত
ls -1 | awk 'ORS=","'
ওআরএস হ'ল "আউটপুট রেকর্ড বিভাজক" তাই এখন আপনার লাইনগুলি কমা দিয়ে যুক্ত হবে।
" OR "
) পরিচালনা করার কারণে এটি বিশেষত দুর্দান্ত
সেটিং IFS
এবং এর ব্যবহারের সংমিশ্রণটি "$*"
আপনি যা করতে পারেন তা করতে পারে। আমি একটি সাবশেল ব্যবহার করছি তাই আমি এই শেলটির $ আইএফএসে হস্তক্ষেপ করব না
(set -- *; IFS=,; echo "$*")
আউটপুট ক্যাপচার করতে,
output=$(set -- *; IFS=,; echo "$*")
set
কাজ করে সে সম্পর্কে আপনার কাছে আরও কিছু তথ্য আছে ? আমার কাছে কিছুটা ভুডোর মতো লাগছে। অগভীর চেহারা man set
আমাকে খুব বেশি তথ্য নেট না।
set
একগুচ্ছ যুক্তি দিয়ে থাকেন তবে কোনও বিকল্প নেই, তবে এটি অবস্থানগত পরামিতিগুলি সেট করে ($ 1, $ 2, ...)। প্রথম আর্গুমেন্ট (বা এই ক্ষেত্রে ফাইলের নাম) কোনও ড্যাশ দিয়ে শুরু হওয়ার ঘটনাটি --
রক্ষা করার জন্য set
রয়েছে। --
বিকল্পের বিবরণটি দেখুন help set
। আমি অবস্থানের পরামিতিগুলিকে জিনিসের একটি তালিকা পরিচালনা করার একটি সুবিধাজনক উপায় খুঁজে পাই। আমি output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
আপনাকে বলবে set is a shell builtin
,। সুতরাং, man set
সাহায্য করবে না, তবে help set
করবে। উত্তর: "- অবস্থানগত পরামিতিগুলিতে কোনও অবশিষ্ট আর্গুমেন্ট বরাদ্দ করুন" "
set -- *
। দেরি সম্প্রসারণ *
এক স্তর আপনি একটি সাব শেলের প্রয়োজন ছাড়াই সঠিক আউটপুট পেতে পারেন: IFS=',' eval echo '"$*"'
। অবশ্যই এটি অবস্থানগত পরামিতিগুলিকে পরিবর্তন করবে।
ls
সাধারণভাবে পার্সিংয়ের পরামর্শ দেওয়া হয় না , সুতরাং বিকল্পতর আরও ভাল উপায় ব্যবহার find
করা উদাহরণস্বরূপ:
find . -type f -print0 | tr '\0' ','
অথবা ব্যবহার করে find
এবং paste
:
find . -type f | paste -d, -s
একাধিক লাইনে যোগদানের জন্য (ফাইল সিস্টেমের সাথে সম্পর্কিত নয়), ইউনিক্স কমান্ড-লাইনে সংক্ষিপ্ত এবং বহনযোগ্য "যোগদান" পরীক্ষা করুন ।
চাকা পুনরুদ্ধার করবেন না।
ls -m
এটা ঠিক যে করে।
ls -m
এবং tr
কমা পরে জায়গা আপনাকে যা করতে হবে মুছে ফেলার জন্যls -m | tr -d ' '
sed 's/, /,/g
শুধু বাশ
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
পিছনটি চম্প করে না , @ ক্যাম্।
bash
এবং gnu printf
printf -v
কেবল ব্যাশে কাজ করবে, যখন উপস্থাপিত উত্তরটি অনেকগুলি শেল প্রকারে কাজ করে।
|
, এই শর্তে যে উভয় লাইন ব্যবহার করা হয়: printf -v mystring "%s|" * ; echo ${mystring%|}
।
এই আদেশটি PERL অনুরাগীদের জন্য:
ls -1 | perl -l40pe0
এখানে 40 হ'ল স্থানের জন্য অষ্টাল আসকি কোড।
-p লাইন এবং মুদ্রণ দ্বারা লাইন প্রক্রিয়া করবে
-l আমরা প্রদান করা আসকি চরিত্রের সাথে the n পেছনের স্থানটি প্রতিস্থাপনের যত্ন নেবে।
- আমরা পিইআরএলকে অবহিত করব আমরা কমান্ড লাইন কার্যকর করছি।
0 এর অর্থ হ'ল বাস্তবায়নের কোন আদেশ নেই।
পার্ল -e0 পার্ল-ই 'এর সমান
দেখে মনে হচ্ছে উত্তরগুলি ইতিমধ্যে বিদ্যমান।
আপনি যদি a, b, c
ফর্ম্যাট করতে চান তবে
ls -m
( টিউলাইনস কর্ডোভার উত্তর) ব্যবহার করুন ) ব্যবহার করুন
অথবা আপনি যদি a b c
ফর্ম্যাট চান তবে ব্যবহার করুন ls | xargs
( ক্রিস জেলের উত্তরের সরল সংস্করণ) )
বা আপনি যদি অন্য কোনও ডিলিমিটার চান তবে |
ব্যবহার করুন ls | paste -sd'|'
( আর্টেমের উত্তরের প্রয়োগ )
মজকিনিটরের উত্তরের শীর্ষে যোগ করা, এখানে অনুসরণযোগ্য ডিলিমিটার অপসারণের উপায় (যেহেতু আমি এখনও তার উত্তরের অধীনে মন্তব্য করতে পারি না):
ls -1 | awk 'ORS=","' | head -c -1
আপনার ডিলিমিটার হিসাবে গণনা করা যতগুলি ট্রেলিং বাইট সরিয়ে ফেলুন।
আমি এই পদ্ধতির পছন্দ করি কারণ আমি বহু চরিত্রের ডেলিমিটারগুলি + এর অন্যান্য সুবিধাদি ব্যবহার করতে পারি awk
:
ls -1 | awk 'ORS=", "' | head -c -2
সম্পাদনা
যেমনটি পিটার লক্ষ্য করেছেন, নেতিবাচক বাইট গণনাটি স্থানীয় ম্যাকোস সংস্করণে সমর্থিত নয় supported এটি তবে সহজেই ঠিক করা যায়।
প্রথমে ইনস্টল করুন coreutils
। "জিএনইউ কোর ইউটিলিটি হ'ল জিএনইউ অপারেটিং সিস্টেমের বেসিক ফাইল, শেল এবং টেক্সট ম্যানিপুলেশন ইউটিলিটিস।"
brew install coreutils
MacOS দ্বারা প্রদত্ত কমান্ডগুলি "g" উপসর্গের সাথে ইনস্টল করা আছে। উদাহরণ স্বরূপgls
।
একবার এটি হয়ে গেলে আপনি ব্যবহার করতে পারেন ghead
যার মধ্যে নেতিবাচক বাইট গণনা রয়েছে, বা আরও ভাল, উপনাম তৈরি করুন:
alias head="ghead"
সরু পথ,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
দ্রষ্টব্য :
এটি জটিলতায় লিনিয়ার, সমস্ত লাইন সেডের প্যাটার্ন স্পেসে যুক্ত হওয়ার পরে কেবলমাত্র প্রতিস্থাপিত হয়।
@ AnandRajaseka এর উত্তর , এবং যেমন কিছু অন্যান্য অনুরূপ উত্তর, এখানে হয় হে (ছিল n ²), কারণ sed প্রত্যেক বার এক একটা নতুন লাইন প্যাটার্ন স্পেস মধ্যে যোগ করা হয় প্রতিস্থাপন করতে হবে।
তুলনা করতে,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
যদি আপনি xargs এর সংস্করণ -d পতাকা সমর্থন করে তবে এটি কাজ করা উচিত
ls | xargs -d, -L 1 echo
-d হ'ল ডিলিমিটার পতাকা
আপনার যদি -d না থাকে তবে আপনি নিম্নলিখিতটি চেষ্টা করতে পারেন
ls | xargs -I {} echo {}, | xargs echo
প্রথম xargs আপনাকে আপনার ডিলিমিটার নির্দিষ্ট করতে দেয় যা এই উদাহরণে কমা।
-d
জিএনইউ xargs সহ ইনপুট ডিলিমিটার নির্দিষ্ট করে, তাই কাজ করবে না। দ্বিতীয় উদাহরণটি এখানে শেষে একটি বিপথগামী ডিলিমিটারের অন্যান্য সমাধানগুলির মতো একই সমস্যাটি প্রদর্শন করে।
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
ব্যাখ্যা:
-e
- কার্যকর করার জন্য একটি কমান্ড নির্দেশ করে
:a
- এটি একটি লেবেল
/$/N
- বর্তমান এবং (এন) এক্সট লাইনটির জন্য ম্যাচের
s/\n/\\n/;
ক্ষেত্রটি নির্ধারণ করে \n
ta;
- ম্যাচটি সফল হলে সমস্ত ইওএলকে প্রতিস্থাপন করে - গোটো লেবেল একটি
আমার ব্লগ থেকে নেওয়া ।
তুমি ব্যবহার করতে পার:
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls
যখন পাইপের সাথে সংযুক্ত থাকে তখন একটি কলাম আউটপুট উত্পন্ন করে, তাই এটি -1
অনর্থক।
বিল্টিন join
ফাংশনটি ব্যবহার করে এখানে আরও একটি পার্ল উত্তর দেওয়া হয়েছে যা কোনও পিছনের ডিলিমিটারটি ছাড়বে না:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
অস্পষ্ট -0777
প্রোগ্রামটি চালানোর আগে পার্লকে সমস্ত ইনপুট পড়তে দেয়।
সিড বিকল্প যা একটি পিছনে সীমানা ছাড়বে না
ls | sed '$!s/$/,/' | tr -d '\n'
ls
কমা এবং একটি স্থান -m
দিয়ে আউটপুট সীমিত করার বিকল্প রয়েছে ", "
।
ls -m | tr -d ' ' | tr ',' ';'
tr
স্থান বা কমাটি মুছে ফেলতে এই ফলাফলটি পাইপ করা tr
আপনাকে ফলসীমাটি পরিবর্তিত করতে পুনরায় ফলাফলটি পাইপ করতে দেয় ।
আমার উদাহরণে আমি ডিলিমিটারটি ডিলিমিটারের ,
সাথে প্রতিস্থাপন করি;
আপনি ;
যে কোনও একটি চরিত্রের ডেলিমিটারটি পছন্দ করেন তার সাথে প্রতিস্থাপন করুন যেহেতু আপনি যে স্ট্রিংগুলিতে আর্গুমেন্ট হিসাবে পাস করেন সেটিতে কেবলমাত্র প্রথম অক্ষরের জন্য অ্যাকাউন্ট থাকে accounts
পিছনে স্ল্যাশ হ্যান্ডলিং সহ দ্রুত পার্ল সংস্করণ:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
ব্যাখ্যা করতে:
ls -1 | paste -s -d ":" -
নিশ্চিত নয় যে এটি পেস্টের সমস্ত সংস্করণ সহ সর্বজনীন কিনা