নতুন লাইনের সাথে ইউনিট ভেরিয়েবলে ফাইল সামগ্রী content


117

নিম্নলিখিত লিখিত সামগ্রী সহ আমার কাছে একটি টেক্সট ফাইল টেস্ট.টেক্সট রয়েছে:

text1
text2 

এবং আমি ফাইলের সামগ্রীটি ইউনিক্স ভেরিয়েবলের কাছে বরাদ্দ করতে চাই, তবে যখন আমি এটি করি:

testvar=$(cat test.txt)
echo $testvar

ফলাফল হলো:

text1 text2

পরিবর্তে

text1
text2 

কেউ কি আমাকে এর সমাধানের পরামর্শ দিতে পারেন?

উত্তর:


184

অ্যাসাইনমেন্টটি নতুন লাইন অক্ষরগুলি সরিয়ে দেয় না , এটি আসলে এটি echoকরছে। এই নতুনলাইনগুলি বজায় রাখতে আপনার স্ট্রিংয়ের চারপাশে কেবল উদ্ধৃতিগুলি দরকার:

echo "$testvar"

এই ইচ্ছা আপনি চান ফলাফল দিতে। একটি ডেমো জন্য নিম্নলিখিত প্রতিলিপি দেখুন:

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

কারণ কেন নতুন লাইন স্পেস দিয়ে প্রতিস্থাপিত হয় নয় সম্পূর্ণভাবে সঙ্গে কাজ করতে echo, কমান্ড বরং এটি কিছু সংমিশ্রণ আছে।

কমান্ড লাইন দেওয়া হলে bashএটিকে IFSভেরিয়েবলের ডকুমেন্টেশন অনুসারে শব্দগুলিতে বিভক্ত করে :

আইএফএস: অভ্যন্তরীণ ক্ষেত্র বিভাজক যা বিস্তারের পরে শব্দ বিভাজনের জন্য ব্যবহৃত হয় ... ডিফল্ট মান <space><tab><newline>

এটি নির্দিষ্ট করে যে ডিফল্টরূপে, এই তিনটি অক্ষরের যে কোনও একটিই আপনার কমান্ডকে পৃথক শব্দের মধ্যে বিভক্ত করতে ব্যবহার করা যেতে পারে। এর পরে, বিভাজক শব্দটি চলে গেছে, আপনি যা রেখে গেছেন তা শব্দের একটি তালিকা।

echoডকুমেন্টেশনের সাথে এটি একত্রিত করুন (একটি bashঅভ্যন্তরীণ কমান্ড), এবং আপনি দেখবেন যে ফাঁকা স্থানগুলি আউটপুট কেন:

প্রতিধ্বনি [-neE] [আরগ ...]: ফাঁকা দ্বারা পৃথক করা আরগগুলি আউটপুট করুন, তারপরে একটি নতুন লাইন।

আপনি যখন ব্যবহার করেন echo "$x", এটি সম্পূর্ণ xপরিবর্তনশীলকে একক শব্দ হিসাবে বাধ্যতামূলক করে bash, তাই এটি বিভক্ত হয় না। আপনি এটি দিয়ে দেখতে পারেন:

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

এখানে, countফাংশনটি সহজেই প্রদত্ত আর্গুমেন্টগুলির সংখ্যা প্রিন্ট করে। 1 2 3এবং a b c dরূপগুলো ক্রিয়াটি সেটি প্রদর্শন করুন।

তারপরে আমরা xভেরিয়েবলের দুটি পরিবর্তনের সাথে এটি চেষ্টা করি । এক ছাড়া কোট শো চার শব্দ আছে, "test", "1", "test"এবং "2"। উদ্ধৃতি যোগ করা এটি একটি একক শব্দ করে "test 1\ntest 2"


উক্তি ... এটাই আমি মিস করছিলাম! ধন্যবাদ!
anonymite

লক্ষ্য করার মতো বিষয়: ট্রেলিং করা নতুনলাইনগুলি কমান্ড সাবস্টিটিউশন অপারেটর নিজেই সরিয়ে ফেলবে: অনলাইনে চেষ্টা করে দেখুন!
জোনাহ

11

এটি আইএফএসের (অভ্যন্তরীণ ক্ষেত্র বিভাজক) ভেরিয়েবলের কারণে যার মধ্যে নতুন লাইন রয়েছে।

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

অস্থায়ীভাবে নতুন লাইনটি না রাখার জন্য আইএফএসকে পুনরায় সেট করা একটি কাজের লক্ষণ :

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

আইএফএসের জন্য এই ভয়াবহ পরিবর্তনটি পুনরুদ্ধার করতে:

IFS=$IFSBAK

আমি এই পরিবর্তনটি করেছি তবে এখন আমার অন্যান্য জিনিসগুলি কাজ করছে না দয়া করে আমাকে এটি পুনরায় সেট করতে বলুন?
পূজা 25

আপনার যদি ভেরিয়েবলের কাছে যেতে না হয় তবে সরাসরি ওয়ান লাইনার:echo "$(IFS=''; cat text.txt)"
কার্টিস ইয়ালাপ

10

বাশ -ge 4 এ অ্যারে ভেরিয়েবলের স্ট্যান্ডার্ড ইনপুট থেকে লাইনগুলি পড়তে ম্যাপফাইলে অন্তর্নির্মিত রয়েছে।

help mapfile 

mapfile < file.txt lines
printf "%s" "${lines[@]}"

mapfile -t < file.txt lines    # strip trailing newlines
printf "%s\n" "${lines[@]}" 

আরো দেখুন:

http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile


3

কেউ যদি অন্য কোনও বিকল্পে আগ্রহী হন:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

আপনার পরিবর্তনশীল দ্বারা সঠিকভাবে সেট করা আছে testvar=$(cat test.txt)। এই ভেরিয়েবলটি প্রদর্শন করতে যা নতুন রেখার অক্ষর ধারণ করে, কেবল ডাবল উদ্ধৃতি যুক্ত করুন, যেমন

echo "$testvar" 

এখানে সম্পূর্ণ উদাহরণ:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

envdirউপযোগ এই কাজ করতে একটি সহজ উপায় প্রদান করে। envdirপরিবেশের ভেরিয়েবলগুলি উপস্থাপন করতে ফাইলগুলি এনভির বর্ণ নামগুলিতে ফাইলের নাম ম্যাপিং এবং এনভ ভার্চ মানগুলিতে ফাইলের সামগ্রী ম্যাপিং সহ ব্যবহার করে uses যদি ফাইলের বিষয়বস্তুগুলিতে নিউলাইন থাকে, তবে এনভির ভারগুলি।

Https://pypi.python.org/pypi/envdir দেখুন

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