एक सीमांकक का उपयोग करते समय रीडायरे द्वारा जोड़ी गई नई लाइन कैसे निकालें?


10
VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR

परिणाम:

[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')

मैं readarrayअंतिम न्यूलाइन नहीं जोड़ने के लिए कैसे कह सकता हूं \n? नवीनतम $प्रतीक का अर्थ क्या है ?


जवाबों:


13

अंतर्निहित अनुरेखीय नई-पंक्ति वर्ण को बेसिन द्वारा नहीं जोड़ा गया है readarray, लेकिन यहां-स्ट्रिंग ( <<<) के द्वारा bash, देखें कि यहां बैश-स्ट्रिंग एक अनुगामी न्यूलाइन चार क्यों जोड़ता है? । नई-लाइन का उपयोग किए बिना स्ट्रिंग को प्रिंट करके आप इससे छुटकारा पा सकते हैं printfऔर इसे एक प्रक्रिया-प्रतिस्थापन तकनीक पर पढ़ सकते हैं< <()

readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR

अब ठीक से उत्पन्न होगा

declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")

3
वाह! मुझे यह कभी नहीं मिला। धन्यवाद
user1156544

4

आप स्प्लिट + ग्लोब का उपयोग कर सकते हैं (तब क्या होता है जब आप सूची के संदर्भों में एक विस्तार छोड़ देते हैं)। यह ज्यादातर समय हमारे रास्ते में आता है, जब हमें वास्तव में इसकी आवश्यकता होती है तो इसका उपयोग नहीं करना शर्म की बात होगी:

IFS=,
set -o noglob

ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter

यह एक अस्थायी फ़ाइल लिखने की तुलना में थोड़ा कम है और फिर उस readarrayपर कॉल करें जैसे कि readarray <<< "$string"दृष्टिकोण में (यह भी ध्यान दें कि readarray -dबहुत हाल के संस्करण की आवश्यकता है bash)।

ध्यान दें कि के बावजूद Sमें IFS(जो के लिए खड़ा है विभाजक ), कि जैसा ही होता है readarrayकि में a,,b,में विभाजित है "a", ""और "b"केवल।

एक वास्तविक विभाजन ऑपरेटर के लिए, आप zshइसके बजाय उपयोग कर सकते हैं :

ARR=("${(@s:,:)VAR}")

( @और खाली तत्वों को संरक्षित करने के लिए दोहरे उद्धरण चिह्नों)।


readarray <<< "$string"एक tempp फाइल करने के लिए लिखते हैं और फिर स्मृति उपयोग करने के बजाय इसे हटा देता है?
user1156544

@ user1156544 हाँ।
मॉसवी

मैं आपके अंतिम आदेश के समान कुछ कैसे कर सकता हूं? मैं बैश 3.3 का उपयोग कर रहा हूं और इसकी कमी की भरपाई करने की कोशिश कर रहा readarray -d
हूं

3

@ StéphaneChazelas के उत्तर का डिब्बाबंद संस्करण:

# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }

$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")

$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...

local -जैसे विकल्प कर देगा set -f( noglobबस चर के रूप में) कार्य करने के लिए स्थानीय,।

declare -n a=$1एक बनाएगा स्थानीय चर aवैश्विक द्वारा नामित चर के लिए एक उपनाम के रूप में $1(कार्य करने के लिए पहला तर्क)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.