डंपिंग एरे के लिए सिंपल वन लाइन ट्रिक
मैंने रिक्त स्थान के साथ एक मान जोड़ा है:
foo=()
foo[12]="bar"
foo[42]="foo bar baz"
foo[35]="baz"
मैं, जल्दी से डंप करने के लिए दे घुमा केसरणियों या साहचर्य सरणियों का उपयोग करता हूं
यह एक लाइन कमांड:
paste <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
प्रस्तुत करेगा:
12 bar
35 baz
42 foo bar baz
व्याख्या की
printf "%s\n" "${!foo[@]}"एक न्यूलाइन द्वारा अलग की गई सभी कुंजियों को प्रिंट करेगा ,
printf "%s\n" "${foo[@]}"एक नई रेखा द्वारा अलग किए गए सभी मानों को प्रिंट करेगा ,
paste <(cmd1) <(cmd2)के उत्पादन cmd1और cmd2लाइन को लाइन से मर्ज करेगा ।
ट्यूनिंग
इससे ट्यून किया जा सकता है -d स्विच :
paste -d : <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
12:bar
35:baz
42:foo bar baz
या और भी:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[35]='baz'
foo[42]='foo bar baz'
सहयोगी सरणी समान काम करेगी:
declare -A bar=([foo]=snoopy [bar]=nice [baz]=cool [foo bar]='Hello world!')
paste -d = <(printf "bar[%s]\n" "${!bar[@]}") <(printf '"%s"\n' "${bar[@]}")
bar[foo bar]="Hello world!"
bar[foo]="snoopy"
bar[bar]="nice"
bar[baz]="cool"
के साथ जारी करें को नई पंक्तियों या विशेष वर्ण
दुर्भाग्य से, कम से कम एक शर्त यह है कि यह काम नहीं करता है: जब चर में नई रेखा नहीं होती है:
foo[17]=$'There is one\nnewline'
कमांड pasteलाइन-दर-लाइन विलय करेगा, इसलिए आउटपुट गलत हो जाएगा:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[17]='There is one
foo[35]=newline'
foo[42]='baz'
='foo bar baz'
इस कार्य के लिए, आप दूसरी कमांड के %qबजाय (और व्हिप को उद्धृत कर सकते हैं) का उपयोग कर सकते हैं :%sprintf
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "%q\n" "${foo[@]}")
सही प्रस्तुत करना होगा:
foo[12]=bar
foo[17]=$'There is one\nnewline'
foo[35]=baz
foo[42]=foo\ bar\ baz
से man bash:
%q causes printf to output the corresponding argument in a
format that can be reused as shell input.
(a b c)एक सरणी में बदलने के लिए इसे लपेटें ।