স্ট্রিংয়ে কিছু অক্ষরকে অন্য একটি চরিত্রের সাথে প্রতিস্থাপন করা


278

আমার কাছে এএক্সএক্সবিসিআইডিএফজেএলএমএন এর মতো একটি স্ট্রিং রয়েছে এবং আমি x , y , এবং z এর সমস্ত উপস্থিতি _ এর সাথে প্রতিস্থাপন করতে চাই ।

আমি কীভাবে এটি অর্জন করতে পারি?

আমি জানি যে এটি কার্যকর echo "$string" | tr 'x' '_' | tr 'y' '_'হবে, তবে আমি পাইপ ব্যবহার না করে একযোগে এটি করতে চাই।


আপনার সাথে পরপর এক্স এর, Y বা z- র এর কোন ক্রম প্রতিস্থাপন করতে চান কি এক আন্ডারস্কোর, অথবা আপনি প্রতিস্থাপন করতে চান হয়নি প্রতিটি এক আন্ডারস্কোর সঙ্গে X, Y, অথবা z? এছাড়াও, মিশ্র সিকোয়েন্সগুলি সম্পর্কে কী বলা যায় AxyzB? তিনটি আন্ডারস্কোর বা একটি?
ডেভিড জেড

tr '[xyz]'প্রতিস্থাপন করবে [এবং ], খুব। যুক্তিটি কেবল অক্ষরের একটি তালিকা হওয়া উচিত (যদিও এর মতো ব্যাপ্তিগুলি a-zঠিক আছে, এবং কিছু বাস্তবায়নে POSIX অক্ষর শ্রেণীর মতো [:digit:])।
ট্রিপলি

উত্তর:


328
echo "$string" | tr xyz _

প্রতিটি সংঘটন প্রতিস্থাপন করবে x, yঅথবা zসঙ্গে _, দান A__BC___DEF__LMNআপনার উদাহরণে।

echo "$string" | sed -r 's/[xyz]+/_/g'

এর পুনরাবৃত্তি ঘটনার প্রতিস্থাপন করবে x, yঅথবা zসঙ্গে একটি একক _, দান A_BC_DEF_LMNআপনার উদাহরণে।


19
ম্যাক-এ, আমি নিম্নলিখিতগুলি পেয়েছি: সেড: অবৈধ বিকল্প - r ব্যবহার: সেড স্ক্রিপ্ট [-Ealn] [-i এক্সটেনশন] [ফাইল ...] সেড [-Ealn] [-i এক্সটেনশন] [-e স্ক্রিপ্ট]। .. [-ফ স্ক্রিপ্ট_ফাইলে] ... [ফাইল ...]
ক্যাটানোরে

আমার একটি স্ট্রিং রয়েছে যাতে ,[]{}()~অক্ষর রয়েছে । আমি এটিকে প্রতিস্থাপন করতে চাই প্রতিটি বিশেষ চরিত্রের সাথে পালিয়ে '\'আমি কীভাবে ওনশোট দিয়ে এটি করতে পারি?
inckka

2
@ হালাকাল ম্যাক জাহাজগুলিতে কিছুটা ভিন্ন সংস্করণের শেড রয়েছে। এই প্রশ্নটি দেখুন: unix.stackexchange.com/questions/13711/… পরিবর্তে আপনি হোমব্রিউ প্যাকেজ ম্যানেজারের সাথে "gnu-sed" ইনস্টল করতে পারেন তারপরে gsedবাইনারিটি ব্যবহার করুন : $ brew install gnu-sedতারপরে$ gsed -r 's/[xyz]+/_/g'
জন ক্যারি

6
* বিএসডি-তে (এবং এইভাবে, ওএসএক্স), অনেকগুলি লিনাক্স ডিস্ট্রোয়ের sed -E(মূলত) সমতুল্য sed -r, যদি আপনি ব্যবহার করেন তবে sed 's/[xyz][xyz]*/_/g'আপনার বিকল্পের প্রয়োজন হবে না। অবশ্যই এটি এটির সমতুল্য tr -s xyz _তাই sedএখানে কোনও বাস্তব প্রয়োজনের প্রয়োজন নেই।
ট্রিপলি

@inckka আপনি এটির trজন্য ব্যবহার করতে পারবেন না । sed 's/[][{}()~,]/\\&/g'তবে সত্যই, আপনার যদি একটি ফলো-আপ প্রশ্ন থাকে তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন (অবশ্যই এখানে রেফারেন্সের জন্য ফিরে লিঙ্ক করতে নির্দ্বিধায়)। ঘটনাক্রমে, ,এবং ~রেগেক্স মেটাচার্যাক্টর নয় (যদিও বাশ এবং কিছু অন্যান্য শেল দ্বারা কিছু অবস্থানে ~প্রসারিত হয় $HOME; shতবে তা নয় )।
ট্রিপলি

286

ব্যাশ প্যারামিটার সম্প্রসারণ ব্যবহার :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}

7
খারাপ প্রতিস্থাপন
অ্যালেক্সি

1
@ অ্যালেক্সি, আমার উদাহরণটি আমার পক্ষে কাজ করে (বাশ ৪.৩.১১ (১) -প্রকাশ করুন)। আপনি ব্যবহার করছেন তা নিশ্চিত করুন bash। অন্যান্য শেলগুলি কাজ নাও করতে পারে (যদিও কিছু হবে)।
ম্যাথু ফ্ল্যাশেন

আপনাকে ধন্যবাদ ম্যাথু ফ্ল্যাশেন। বাশ স্ক্রিপ্টে পরম পাথের জন্য একটি সেড প্রতিস্থাপনের জন্য আমার ঠিক এটির প্রয়োজন ছিল (/ এর সাথে with / এর পরিবর্তে সেড গ্রহণ করে)।
রায়ান জি

1
@ রায়ানজি sedবাশ যদি বিল্ট-ইন প্রতিস্থাপন করে থাকে তবে কেন ব্যবহার করবে ?
MestreLion

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

111

আপনি এই লিঙ্কটি সহায়ক মনে করতে পারেন:

http://tldp.org/LDP/abs/html/string-manipulation.html

সাধারণভাবে,

Match সাবস্ট্রিংয়ের প্রথম ম্যাচটি $ প্রতিস্থাপনের সাথে প্রতিস্থাপন করতে:

${string/substring/replacement}

Matches সাবস্ট্রিংয়ের সমস্ত মিল replace প্রতিস্থাপনের সাথে প্রতিস্থাপন করতে:

${string//substring/replacement}

সম্পাদনা: নোট করুন যে এটি স্ট্রিং নামের একটি ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য।


16
মনে রাখবেন যে এটি "স্ট্রিং" নামক একটি চলকটিতে আক্ষরিক স্ট্রিংয়ের উপরে নয়।
mattdm

1
সর্বাধিক সহায়ক, যেহেতু এটিতে উল্লেখ রয়েছে।
ওস 3

সেরা এবং সংক্ষিপ্ততম সমাধান।
উত্তর

8
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

you এর মধ্যে যতগুলি আপনার প্রয়োজন হিসাবে ব্যবহার করুন এবং আপনি নিজের বেসিক এনক্রিপশন করতে পারেন


5

এখানে শেল প্যারামিটার বিস্তারের সমাধান রয়েছে যা একাধিক সংঘবদ্ধ ঘটনাকে একক সাথে প্রতিস্থাপন করে _:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

লক্ষ্য করুন যে প্যাটার্নটির সাথে বর্ধিত প্যাটার্ন মেলানো দরকার+(pattern)

shopt -s extglob

বিকল্পভাবে, এর -s("স্কিচ") বিকল্পের সাথে tr:

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