বাশে একটি চরিত্রের সাথে অন্য একটি চরিত্র প্রতিস্থাপন করুন


223

আমার একটি স্থানকে প্রতিস্থাপন করাতে সক্ষম হতে হবে (.ব্যাশের একটি স্ট্রিংয়ে একটি স্পট ( ) একটি বিন্দু ( ) দিয়ে able

আমি মনে করি এটি বেশ সহজ হবে তবে আমি নতুন তাই এই ব্যবহারের জন্য কীভাবে অনুরূপ উদাহরণটি পরিবর্তন করব তা আমি বুঝতে পারি না।

উত্তর:


390

ইনলাইন শেল স্ট্রিং প্রতিস্থাপন ব্যবহার করুন। উদাহরণ:

foo="  "

# replace first blank only
bar=${foo/ /.}

# replace all blanks
bar=${foo// /.}

আরও তথ্যের জন্য http://tldp.org/LDP/abs/html/string-manipulation.html দেখুন ।


1
যদিও সংক্ষিপ্ত স্ট্রিংগুলি (সাধারণ ক্ষেত্রে, আমার ধারণা) এর সাথে ডিল করার সময় এই সমাধানটি ভাল হয় তবে কেউ trদীর্ঘ স্ট্রিংয়ের পক্ষে পছন্দ করতে পারে । আমার সিস্টেমে trবাশকে 1000অক্ষরের চেয়ে বেশি স্ট্রিং দিয়ে শুরু করে বাশকে ছাপিয়ে যায় । দেখে মনে হচ্ছে বাশের সময়ের জটিলতা লিনিয়ারের চেয়ে খারাপ। একটি ছোট পরীক্ষা: x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"। 1 এম (= 2 ^ 20) এর স্ট্রিং দৈর্ঘ্যের সাথে trনেওয়া 0.04sএবং ব্যাশ 5.0.11 লেগেছে 17s। সাথে 2 এম trনিল 0.07s(প্রত্যাশিত) তবে বাশ লাগল 69s(স্ট্রিং দৈর্ঘ্যের দ্বিগুণ হিসাবে 4 বার)।
সোসোই

@ সোকউই ভেরিয়েবলে 1Mb সঞ্চিত বাজানো আসলে স্বাভাবিক নয়! 10 কেবি'রও বেশি পর্যন্ত, ব্যাশকে আরও দৃking়তার সাথে দাঁড় করিয়ে মনে হচ্ছে tr! ... উপলভ্য মেমরি এবং এইচডাব্লুয়ের সংস্থানগুলির উপর নির্ভর করে ... তবে আপনি ঠিক বলেছেন!: কাজ করার ধরণের উপর নির্ভর করে, উত্সর্গীকৃত সরঞ্জামগুলি আরও দক্ষ থাকে!
এফ হাউরি

নতুন লাইন মত পলান অক্ষরের জন্য, জন্য অনুসন্ধান করতে নিশ্চিত করুন$'\n'
user2561747

75

আপনি এটির trমতো ব্যবহার করতে পারেন :

tr " " .

উদাহরণ:

# echo "hello world" | tr " " .
hello.world

থেকে man tr:

বর্ণনা
     অনুবাদ, লুৎফর, এবং / অথবা স্ট্যান্ডার্ড ইনপুট থেকে ডিলিট অক্ষর, মানক আউটপুটে ing writ-।


যদিও এটি যেমন জিজ্ঞাসা করা হয়েছিল সেই প্রশ্নের জন্য কাজ করে, এটি স্বীকৃত উত্তরের চেয়ে কম সাধারণ (যা চরিত্র প্রতিস্থাপনে এবং স্বেচ্ছাসেবী স্ট্রিংগুলিতেও কাজ করে), এবং এতে জড়িত এবং বাহ্যিক আদেশও রয়েছে।
ড্যান ড্যাসকলেস্কু

2
অন্যদিকে এটি পুরো জিনিসটিকে মেমরিতে লোড না করে একটি 2 জিবি ফাইলে কাজ করে।
আইয়ুব

প্রশ্নটি ছিল "স্ট্রিং ইন ব্যাশ" সম্পর্কে, যথেচ্ছ বড় ফাইল নয়।
ড্যান ড্যাসকলেসকু

52

ব্যাশে, আপনি কনস্ট্রাক্টের সাথে স্ট্রিংয়ে প্যাটার্ন প্রতিস্থাপন করতে পারেন ${VARIABLE//PATTERN/REPLACEMENT}। শুধুমাত্র প্রথম ঘটনাটি প্রতিস্থাপন করতে কেবল /এবং না ব্যবহার করুন //। প্যাটার্নটি ফাইল গ্লোবগুলির মতো একটি ওয়াইল্ডকার্ড প্যাটার্ন।

string='foo bar qux'
one="${string/ /.}"     # sets one to 'foo.bar qux'
all="${string// /.}"    # sets all to 'foo.bar.qux'



4

পাথের জন্য এটি ব্যবহার করে দেখুন:

echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'

এটি ডাবল-কোটড স্ট্রিংয়ের অভ্যন্তরের স্থানটি একটি +গাওয়ার সাথে প্রতিস্থাপন করে, তারপরে প্রতিস্থাপন করে+ ব্যাকস্ল্যাশ দিয়ে , তারপরে ডাবল-কোটগুলি সরিয়ে / প্রতিস্থাপন করে।

সাইগউইনের আমার একটি পাথের স্থানগুলি প্রতিস্থাপন করতে আমাকে এটি ব্যবহার করতে হয়েছিল।

echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'

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