स्ट्रिंग का पहला शब्द कैसे प्राप्त करें?


43

जब मुझे 'echo *' निम्न आउटपुट मिले:

file1 file2 file3 ...

जो मैं चाहता हूं, वह पहला शब्द है। मैं कैसे आगे बढ़ सकता हूं?


1
lsयदि किसी फ़ाइल नाम में कोई रिक्त है, तो @mattdm का उपयोग करना काम नहीं करेगा।
हेल्परमेथोड

2
आप शब्द को कैसे परिभाषित करते हैं ? यदि पहली फ़ाइल है Sunset on a beach.jpg, तो यह Sunsetया पूरी फ़ाइल नाम होना चाहिए ? किस बारे में Sea, sex and sun.ogg? Sea, Sea,या पूरे फ़ाइल नाम?
स्टीफन चेज़लस

@mattdm ls | head -1मुझे यादृच्छिक चीजें देता है जैसे a.patch p.pyकि पहला शब्द नहीं है और वर्णमाला के क्रम में फाइलें भी नहीं है।
फुल्विक

जवाबों:


52

आप इसे awk के माध्यम से पाइप कर सकते हैं और इसे पहले शब्द को प्रतिध्वनित कर सकते हैं

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

या आप स्ट्रिंग को काटते हैं और पहले शब्द का चयन करते हैं:

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

या आप इसे थुगु सीड पाइप करते हैं और यह सब कुछ हटा देता है लेकिन पहला शब्द

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

| head -n1नाइटपिकर को संतुष्ट करने के लिए जोड़ा गया । यदि आपकी स्ट्रिंग में नई-नई पंक्तियाँ | head -n1हैं, तो पहली पंक्ति पहली पंक्ति का चयन करेगी, इससे पहले कि महत्वपूर्ण आदेश उसमें दिए गए स्ट्रिंग में से पहला शब्द चुनें।


1
हर लाइन का पहला शब्द होगा, पहला शब्द नहीं।
स्टीफन चेज़लस

2
मुझे आश्चर्य है कि कितनी पंक्तियाँ echo *उत्पन्न होती हैं
बनंगुइन

यह निर्भर करता है कि उनके नाम में या पर्यावरण पर निर्भर करते हुए कितनी फ़ाइलों में न्यूलाइन वर्ण हैं या कैसे बैश संकलित किया गया था या कुछ फ़ाइल को कॉल किया गया था -eया -ee... सूची \nमें दिखाई देता है, फ़ाइल नाम में कितने समय दिखाई देते हैं। अगर कोई फ़ाइल कहा जाता है -n, तो यह किसी भी लाइन को वापस नहीं कर सकता है ...
स्टीफन चेज़लस

खैर, हम अभी भी बैश की बात कर रहे हैं और 1. आम तौर पर बैश को नई लाइनों के साथ एक तार के साथ एक नई सीमा के साथ पारित नहीं किया जाएगा। 2. यह बहुत ही कठिन और असामान्य (असंभव?) है। फ़ाइल नाम a \ n के रूप में दिखाई देगा। 3 के साथ शुरू होने वाले फ़ाइल नाम के लिए 3 होल्ड है - 5. यहां तक ​​कि जब -n या -e इको के साथ कॉल किया जाता है तो स्टडआउट खुल जाएगा और इसे बंद कर देगा जब ऐसा किया जाता है, तो निश्चित रूप से यह एक पंक्ति में वापस आ जाएगा, और कम से कम एक तार, उस बात के लिए 6. मैंने अपनी सलाह को कम से कम
बहुस्तरीय

1
सभी 5 अंक झूठे हैं। खाली डायर में कोशिश करें: 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अनिर्दिष्ट है अगर इनपुट में अंतिम नई वर्ण और व्यवहार में कार्यान्वयन के बाद अलग-अलग वर्ण हैं।
स्टीफन चेज़लस

18

एक सकारात्मक खोल (यह /bin/shकर /bin/bashसकते हैं)

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

निर्माण प्रतिस्थापन हटाने${all%% *} का एक उदाहरण है । साधन के सबसे लंबे समय तक मैच को नष्ट चर के दाएँ हाथ के अंत से (एक अंतरिक्ष कुछ भी के बाद) । आप यहां स्ट्रिंग हेरफेर के बारे में अधिक पढ़ सकते हैं ।%%*all

यह समाधान मानता है कि विभाजक एक स्थान है। यदि आप फ़ाइल नामों के साथ ऐसा कर रहे हैं, तो रिक्त स्थान के साथ कोई भी इसे तोड़ देगा।


अच्छा है। लेकिन मुझे इसके साथ सरल और अधिक गैर-हैकी अन्य संस्करण पसंद आए headऔरcut
अनवर

4
IMO, हेड, कट और सेड कम सरल हैं। जब अन्य पैरामीटर प्रतिस्थापन कार्य कुशलतापूर्वक कार्य करता है तो एक अन्य उपकरण क्यों स्पॉन करें। यह उत्तर सबसे अलग और सबसे पोर्टेबल तरीका है जो अंतरिक्ष-पृथक शब्दों की सूची के पहले शब्द को लेने के लिए है (जो कि सभी ओपी ने पूछा है)।
जुआन

7

यह मानते हुए कि आप वास्तव में पहला नाम चाहते हैं और पहला शब्द नहीं , यहाँ एक तरीका है जो व्हाट्सएप पर नहीं टूटता है:

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

1
पहला शब्द भी आसान होगा:files=($(echo *))
Hauke ​​Laging

2
यह "-n", "-ई", "-ने", "-एनेने" ... पर टूट जाएगा, और कैसे bashसंकलित किया गया था या पर्यावरण पर निर्भर करता है, संभवतः बैकलैश पात्रों पर, हालांकि।
स्टीफन चेज़लस

2
@ हॉकिंग, आपको ग्लोबिंग को अक्षम करना होगा। जैसे: text=$(echo *); set -f; files=($text)अन्यथा अधिक वाइल्डकार्ड का विस्तार किया जा सकता है।
स्टीफन चेज़लस

3
औरfiles=$(echo *); echo ${files%% *}
vdegenne

1
@memnoch_proxy यह व्हॉट्सएप वाले फाइलनाम पर टूट जाएगा, इसे सावधानी से उपयोग करें।
क्रिस डाउन

5

आप स्थितिगत मापदंडों का उपयोग कर सकते हैं

set -- *
echo "$1"

3
ध्यान रखें कि यह आपकी स्क्रिप्ट में किसी भी अन्य तर्क को नष्ट कर देगा, जब तक कि एक सहायक दायरे में नहीं चलता। *यदि निर्देशिका में कोई फ़ाइल नहीं है, तो इसका विस्तार भी होगा ।
क्रिस डाउन

shopt -s nullglobसंभालना होगा कि
ग्लेन जैकमैन



1

संपूर्ण प्रथम फ़ाइल नाम प्राप्त करना:

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.