ডিলিমিটার ব্যবহার করার সময় রিডারারে যুক্ত হওয়া নতুন লাইনটি কীভাবে সরিয়ে ফেলবেন?


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প্রক্রিয়া-প্রতিস্থাপনের কৌশলতে পড়তে পারেন rid< <()

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

সঠিকভাবে এখন উত্পন্ন হবে

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

3
কি দারুন! আমি এই কখনও পাওয়া যাবে না। ধন্যবাদ
ব্যবহারকারী 1156544

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 ফাইলে লিখেছেন এবং তারপর মেমরি ব্যবহারের পরিবর্তে মোছা হয়?
ব্যবহারকারী 1156544

@ ব্যবহারকারী 1156544 হ্যাঁ।
মশভী

ব্যাশে আপনার শেষ কমান্ডের মতো আমি কীভাবে কিছু করতে পারি? আমি ব্যাশ 3.3 ব্যবহার করছি এবং অভাব ক্ষতিপূরণ করার চেষ্টাreadarray -d
user1156544

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 -fnoglob

declare -n a=$1একটি তৈরি করবে স্থানীয় পরিবর্তনশীল aবৈশ্বিক নামে পরিবর্তনশীল একটি ওরফে যেমন $1(ফাংশন প্রথম আর্গুমেন্ট)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.