আমি কীভাবে ব্যাশ অ্যারে ভেরিয়েবলকে নতুন লাইনের সাথে ডিলিমিট করা স্ট্রিংয়ে রূপান্তর করব?


50

আমি একটি নতুন লাইনে প্রতিটি উপাদান সহ একটি ফাইলের জন্য ব্যাশ অ্যারে ভেরিয়েবল লিখতে চাই। আমি একটি লুপের জন্য এটি করতে পারি, তবে এর সাথে উপাদানগুলিতে যোগ দেওয়ার জন্য আরও কোনও (ক্লিনার) উপায় আছে \n?

উত্তর:


59

এখানে এমন একটি উপায় যা বাশ প্যারামিটার সম্প্রসারণ এবং এর IFSবিশেষ চলকটি ব্যবহার করে।

$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )

আমরা IFSবর্তমান পরিবেশের মান ওভাররাইট করা এড়াতে সাবসেল ব্যবহার করি । সেই সাবশেলে, আমরা এর পরে এর মানটি সংশোধন করি IFSযাতে প্রথম অক্ষরটি একটি নতুন লাইন হয় ( $'...'উদ্ধৃতি ব্যবহার করে)। অবশেষে, আমরা একক শব্দ হিসাবে অ্যারের সামগ্রীগুলি মুদ্রণ করতে প্যারামিটার সম্প্রসারণ ব্যবহার করি; প্রতিটি উপাদান প্রথম চ্যারাটার দ্বারা পৃথক করা হয় IFS

একটি পরিবর্তনশীল ক্যাপচার:

$ var=$( IFS=$'\n'; echo "${System[*]}" )

যদি আপনার বাশ যথেষ্ট নতুন হয় (4.2 বা তার পরে), আপনি এখনও (এবং হওয়া উচিত) বিকল্পটি printfদিয়ে ব্যবহার করতে পারেন -v:

$ printf -v var "%s\n" "${System[@]}"

উভয় ক্ষেত্রেই, আপনি চূড়ান্ত নতুন লাইনটি না চাইতে পারেন var। এটা মুছে ফেলার জন্য:

$ var=${var%?}    # Remove the final character of var

ধন্যবাদ, ভেরিয়েবলের কাছে আউটপুট দেওয়ার কোনও উপায় আছে কি?
এসাইক্লিক

কীভাবে কোনও ভেরিয়েবলের ক্যাপচার করবেন তা দেখানোর জন্য আপডেট করা হয়েছে।
চিপনার

2
শেষ উদাহরণটি var=${var%?}পরিবর্তে হওয়া উচিত নয় ? এটি কোনও নিয়মিত প্রকাশ নয়, সুতরাং .কেবলমাত্র একটি পিরিয়ড চরিত্রের সাথে মেলে।
মুশিফিল

অ্যারে ভেরিয়েবলের নামটি উদ্ধৃত করা দরকার:$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
সেফ

28

আপনি printfপ্রতিটি অ্যারে আইটেমটি তার নিজস্ব লাইনে মুদ্রণ করতে ব্যবহার করতে পারেন :

 $ System=('s1' 's2' 's3' 's4 4 4')
 $ printf "%s\n"  "${System[@]}"
s1
s2
s3
s4 4 4

7
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"

অথবা

perl -le 'print join "\n",@ARGV' "${arr[@]}"

অথবা

python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"

অথবা

sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"

অথবা

lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"

অথবা

tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"

অথবা

php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"

অথবা

ruby -e 'puts ARGV.join("\n")' "${arr[@]}"

এতক্ষণ আমি এটাই মনে করিয়ে দিতে পারি।


2

উপরের সমাধানগুলি এটি বেশ অনেকগুলি, তবে মূল প্রশ্নটি ফাইলের আউটপুট চেয়েছে:

$ a=(a b c d e)
$ ( IFS=$'\n'; echo "${a[*]}" ) > /tmp/file
$ cat /tmp/file
a
b
c
d
e
$

দ্রষ্টব্য: 1) 'প্রতিধ্বনি' চূড়ান্ত নিউলাইন সরবরাহ করে 2) যদি এই ফাইলটি আবার ব্যাশের মাধ্যমে পড়তে পারে, তবে ঘোষিত -p সিরিয়ালাইজেশন চেয়েছিল হতে পারে।


2

এর জন্য ব্যবহার :

for each in "${alpha[@]}"
do
  echo "$each"
done

ইতিহাস ব্যবহার ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে !:

history -p "${alpha[@]}"

বেসনাম ব্যবহার করা ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে /:

basename -a "${alpha[@]}"

শুফ ব্যবহার করা ; নোট করুন যে ফলাফলগুলি ক্রমে প্রকাশিত হতে পারে:

shuf -e "${alpha[@]}"

0

আমার গ্রহণ , পরিবর্তন না করে কেবল বাশ বিল্টিন ব্যবহার করে IFS:

# $1  separator
# $2… strings
join_strings () {
    declare separator="$1";
    declare -a args=("${@:2}");
    declare result;
    printf -v result '%s' "${args[@]/#/$separator}";
    printf '%s' "${result:${#separator}}"
}

উদাহরণ

$ join_strings $'\n' "a b c" "d e f" "g h i"
a b c
d e f
g h i

আপনি যে কোনও বিভাজক ব্যবহার করতে পারেন:

$ join_strings '===' "a b c" "d e f" "g h i"
a b c===d e f===g h i

-1

printf একটি অ্যারের থেকে সীমাবদ্ধ স্ট্রিং তৈরি করার জন্য এটি সবচেয়ে দক্ষ পদ্ধতির বলে মনে হচ্ছে:

# create a delimited string; note that printf doesn't put the trailing delimiter
# need to save and restore IFS
# it is prudent to put the whole logic on a single line so as to minimize the risk of future code changes breaking the sequence of saving/restoring of IFS
oldIFS=$IFS; IFS=$'\n'; printf -v var "${arr[*]}"; IFS=$oldIFS

# print string to file; note that the newline is required in the format string because printf wouldn't put a trailing delimiter (which is a good thing)
printf '%s\n' "$var" > file

এটি করার একটি এমনকি সহজ উপায় হ'ল:

delim=$'\n'
printf -v var "%s$delim" "${arr[@]}" # create a delimited string
var="${var%$delim}"                  # remove the trailing delimiter

উদাহরণ

delim=:
arr=(one two three)
printf -v var "%s$delim" "${arr[@]}" # yields one:two:three:
var="${var%$delim}"                  # yields one:two_three

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