আমি শেল ভেরিয়েবলগুলি থেকে স্পেসগুলি কীভাবে সরিয়ে ফেলব?


15

কমান্ড লাইনে আমি নিম্নলিখিতটি করেছি:

$ text="name with space"
$ echo $text
name with space

আমি tr -d ' 'স্পেসগুলি সরাতে ব্যবহার করার চেষ্টা করছি এবং এর ফলাফল রয়েছে:

namewithspace

আমি কয়েকটি জিনিস চেষ্টা করেছি যেমন:

text=echo $text | tr -d ' '

কোন ভাগ্য এখনও পর্যন্ত আশা করি আপনি দুর্দান্ত লোক সাহায্য করতে পারে না!

উত্তর:


45

বাশে, আপনি বাশের অন্তর্নির্মিত স্ট্রিং ম্যানিপুলেশন ব্যবহার করতে পারেন। এই ক্ষেত্রে, আপনি এটি করতে পারেন:

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

স্ট্রিং ম্যানিপুলেশন অপারেটরগুলির আরও তথ্যের জন্য, http://tldp.org/LDP/abs/html/string-manipulation.html দেখুন

তবে, আপনার মূল কৌশলটিও কাজ করবে, আপনার বাক্য গঠনটি কেবল খানিকটা বন্ধ off

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

আমি এমনকি এটি ভাবিনি, একটি টিআর মেজাজ এই কাজ করছে! দুর্দান্ত উত্তরও!
user3347022

11

আপনার কোনও echoকমান্ডের দরকার নেই , পরিবর্তে এখানে স্ট্রিং ব্যবহার করুন :

text=$(tr -d ' ' <<< "$text")

কেবল কৌতূহলের জন্য আমি পরীক্ষা করেছিলাম যে এই ধরনের তুচ্ছ কাজ বিভিন্ন সরঞ্জামের জন্য কত সময় নেয়। এখানে ধীরতম থেকে দ্রুততম পর্যন্ত ফলাফলগুলি সাজানো হয়েছে:

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

খাঁটি শেল অপারেশনটি অবশ্যই আশ্চর্যজনক নয় যা আশ্চর্যজনক নয়, তবে এটি সত্যই কী চিত্তাকর্ষক যে এটি 100 গুণ বেশি গতিবেগের পরে সবচেয়ে ধীর কমান্ড!


এটি সর্বদা সত্য নয় স্ট্যাকওভারফ্লো.com
স্টিভেন পেনি

5

কেবল নীচে যেমন আপনার পাঠ্য পরিবর্তনশীল পরিবর্তন করুন।

text=$(echo $text | tr -d ' ')

তবে, আমাদের যদি নিয়ন্ত্রণের অক্ষর থাকে তবে এটি ভেঙে যেতে পারে। সুতরাং, ক্যাস্পার্ডের পরামর্শ অনুসারে, আমরা এর চারপাশে ডাবল উদ্ধৃতি পেতে পারি। সুতরাং,

text="$(echo "$text" | tr -d ' ')"

একটি ভাল সংস্করণ হবে।


চমৎকার! আমি খুব কাছে ছিলাম। একটি নুব হিসাবে আমি সন্তুষ্ট আমি সঠিক দিকে যাচ্ছিলাম! দ্রুত প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ, আমি 8 মিনিট অপেক্ষা করার সাথে সাথে আমি উত্তর হিসাবে এটি জমা দেব!
user3347022

@ ইউজার ৩৩7070০২২২, আপনাকে স্বাগতম :)
রমেশ

1
এটি ভাঙ্গতে চলেছে যদি $textনিয়ন্ত্রণের অক্ষর থাকে, যা শেল দ্বারা ব্যাখ্যা করা হবে। আরও কিছু এখানে ডাবল-কোট text="$(echo "$text" | tr -d ' ')"
রাখুন

@ ক্যাস্পার্ড, এটি উল্লেখ করার জন্য ধন্যবাদ। আমি আপনার পরামর্শ অন্তর্ভুক্ত করেছি।
রমেশ


2

একটি বিশেষ ক্ষেত্রে যখন আপনার একটি ভেরিয়েবলের প্রয়োজন হয় যার একটি নম্বর থাকে:

SH:

typeset -i A=B #or
typeset -i A="   23232"

ksh:

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