जवाबों:
बहुत पहले विकल्प के समान है, लेकिन अनुगामी परिसीमन को छोड़ देता है
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=","'
ORS "आउटपुट रिकॉर्ड सेपरेटर" है, इसलिए अब आपकी लाइनें अल्पविराम से जुड़ जाएंगी।
" OR "
) से निपटने के कारण यह विशेष रूप से भयानक है
सेटिंग IFS
और उपयोग का संयोजन "$*"
आप जो चाहते हैं वह कर सकते हैं। मैं एक उपखंड का उपयोग कर रहा हूं इसलिए मैं इस शेल के $ 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%|}
|
, @camh chomp नहीं है ।
bash
और printf
printf -v
केवल बैश में काम करेगा, जबकि प्रस्तुत उत्तर कई शेल प्रकारों पर काम करता है।
|
, बशर्ते कि दोनों पंक्तियों का उपयोग किया जाए printf -v mystring "%s|" * ; echo ${mystring%|}
:।
यह आदेश PERL प्रशंसकों के लिए है:
ls -1 | perl -l40pe0
यहां 40 स्पेस के लिए ऑक्टल अस्की कोड है।
-p लाइन और प्रिंट द्वारा लाइन प्रोसेस करेगा
-लगता है कि हम प्रदान करने वाले एएससीआई चरित्र के साथ ट्रेलिंग \ n को बदलने का ख्याल रखेंगे।
-हम पेरल को सूचित करना है कि हम कमांड लाइन निष्पादन कर रहे हैं।
0 का मतलब है कि निष्पादित करने के लिए वास्तव में कोई आदेश नहीं है।
perl -e0 perl -e के समान है ''
ऐसा लगता है कि उत्तर पहले से मौजूद हैं।
यदि आप 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
संपादित करें
जैसा कि पीटर ने देखा है, नकारात्मक बाइट गिनती देशी मैकओएस संस्करण में समर्थित नहीं है। यह हालांकि आसानी से तय किया जा सकता है।
सबसे पहले, स्थापित करें coreutils
। "जीएनयू कोर यूटिलिटीज जीएनयू ऑपरेटिंग सिस्टम की मूल फ़ाइल, शेल और टेक्स्ट हेरफेर यूटिलिटीज हैं।"
brew install coreutils
MacOS द्वारा प्रदान किए गए कमांड भी उपसर्ग "जी" के साथ स्थापित होते हैं। उदाहरण के लिए 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 का उत्तर , और कुछ अन्य समान उत्तर, जैसे कि यहाँ , O (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
बनाता है कि प्रोग्राम चलाने से पहले सभी इनपुट को पढ़ लिया जाए।
sed विकल्प जो अनुगामी परिसीमन को नहीं छोड़ता है
ls | sed '$!s/$/,/' | tr -d '\n'
ls
एक अल्पविराम और एक स्थान के -m
साथ आउटपुट को परिसीमित करने का विकल्प ", "
है।
ls -m | tr -d ' ' | tr ',' ';'
tr
अंतरिक्ष या अल्पविराम को हटाने के लिए इस परिणाम को पाइप करने से आप tr
परिसीमन को बदलने के लिए फिर से परिणाम को पाइप कर सकेंगे ।
मेरे उदाहरण में मैं सीमांकक को सीमांकक के ,
साथ प्रतिस्थापित करता हूं;
आप ;
जो भी एक चरित्र सीमांकक के साथ बदलना चाहते हैं, क्योंकि tr केवल उन तर्कों के रूप में पारित होने वाले पहले चरित्र के लिए खाता है।
अनुगामी स्लैश हैंडलिंग के साथ त्वरित पर्ल संस्करण:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
समझाना:
ls -1 | paste -s -d ":" -
यदि पेस्ट के सभी संस्करणों के साथ सार्वभौमिक है, तो यह निश्चित नहीं है