Sed ব্যবহার না করে স্ট্রিংটি কীভাবে সন্ধান এবং প্রতিস্থাপন করতে পারি?


16

আমরা সব জানি, sedউদাহরণস্বরূপ খুঁজুন 'একটি' জন্য, ব্যাপকভাবে খুঁজে পেতে এবং স্ট্রিং প্রতিস্থাপন করতে কার্যকরী এবং 'খ' থেকে এটি প্রতিস্থাপন: sed 's/a/b/g'

এর পরিবর্তে অন্য কমান্ড বা শেল স্ক্রিপ্ট দিয়ে এটি করা সম্ভব sed?

এটি এমন টিভির জন্য ক্রপযুক্ত লিনাক্স সিস্টেমের জন্য যাতে sedকমান্ড নেই। সুতরাং এর পরিবর্তে আমাকে অন্যান্য কমান্ড বা স্ক্রিপ্ট ব্যবহার করতে হবেsed 's/a/b/g'. –


আসলে, এটি কেবল নিয়মিত প্রকাশ ভিত্তিক প্রতিস্থাপন। কোন টুল বা শুধুমাত্র যেমন জিনিস হ্যান্ডেল করতে সক্ষম একই কাজ পাবে, কিন্তু বিভিন্ন সিনট্যাক্স সঙ্গে $var=~s/a/b/g, gsub(/a/,"b",var), var.gsub(/a/,'b'), var.replace(/a/g,'b'), preg_replace("/a/","b",$var), regsub -all a b $var। এর পাশাপাশি, অনেক সরঞ্জাম এবং ভাষাও সরল পাঠ্য স্ট্রিং প্রতিস্থাপন করতে পারে। সুতরাং আপনার প্রশ্ন একরকম বিস্তৃত।
manatwork

1
কেন? আপনি কোন সমস্যার সমাধান করার চেষ্টা করছেন?
গিলস 15:55-

টিভির জন্য ক্রপযুক্ত লিনাক্স সিস্টেমে কমান্ড নেই। সুতরাং আমাকে 's / a / b / g' এর পরিবর্তে অন্য কমান্ড বা স্ক্রিপ্ট ব্যবহার করতে হবে।
বিংহেঞ্জক

উত্তর:


12

হ্যাঁ এটি করার বিভিন্ন উপায় রয়েছে। আপনি এই ক্রিয়াকলাপগুলি ব্যবহার করতে পারেন awk, perlবা bashকরতেও পারেন। সাধারণত যদিও sedএই ধরণের কাজগুলি করার জন্য সম্ভবত সবচেয়ে অ্যাপ্রোপস সরঞ্জাম।

উদাহরণ

বলুন যে আমার কাছে একটি ফাইলে এই নমুনা ডেটা রয়েছে data.txt:

foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50

awk

$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

পার্ল

$ perl -pe "s/foo/foofoofoo/g" data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

ইনলাইন সম্পাদনা

উপরের উদাহরণগুলি সরাসরি ফাইলগুলিকেও পরিবর্তন করতে পারে। পার্ল উদাহরণটি তুচ্ছ। কেবল -iস্যুইচ যুক্ত করুন ।

$ perl -pie "s/foo/foofoofoo/g" data.txt 

কারণ awkএটি কিছুটা কম প্রত্যক্ষ কিন্তু কার্যকর হিসাবে:

$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt

এই পদ্ধতিটি বন্ধনীগুলির {...} with সহ একটি উপ-শেল তৈরি করে যেখানে ফাইলটি এর মাধ্যমে এটির মধ্যে পুনঃনির্দেশ করা হয়:

$ { ... } < data.txt

একবার সাব-শেলের মধ্যে ফাইলটি পুনঃনির্দেশিত হয়ে গেলে, এটি মুছে ফেলা হয় এবং তারপরে awkউপ-শেলগুলিতে পড়া ফাইলটির সামগ্রীগুলির বিরুদ্ধে চালানো হয় STDIN। এই বিষয়বস্তুটি পরে প্রক্রিয়া করা হয় awkএবং একই ফাইলটির নাম হিসাবে এটি সরিয়ে ফেলা হয়, কার্যকরভাবে এটি প্রতিস্থাপন করে।


আপনাকে উত্তর দেওয়ার জন্য ধন্যবাদ এবং আমি এটি পরবর্তী ওয়ার্ড ডেতে চেষ্টা করব B তবে এটি নিশ্চিত কিনা তা আমি নিশ্চিত নই কারণ টিভিতে একটি ক্রপড লিনাক্স সিস্টেমে কিছু কমান্ড সম্ভবত উপস্থিত নেই, যেমন 'সেড' o সুতরাং আমি এখনও 'অনুসন্ধান' কমান্ডটি ব্যবহার করতে চাই , 'গ্রেপ' ইত্যাদি সমাধান করার জন্য।
বিঙ্গেনজাক

@ বিভেনজিকিউ - আমি উদাহরণগুলি যুক্ত করেছি যা ফাইলটি ইনলাইন সম্পাদনা করে।
slm

-১ আমি খুব কমই ডাউনভোট করি তবে এই ক্ষেত্রে প্রশ্নের পয়েন্টটি আরও বেশি / সমান জটিল এবং সম্ভবত নির্ভরশীলের চেয়ে সহজ পদ্ধতি বলে মনে হয়েছিল। যদি প্রশ্নটি একটি পূর্ণ * নিক্স মেশিন ইনস্টল করার বিকল্প সম্পর্কে ছিল তবে আমি সম্ভবত এটি +1 করতাম অন্যথায় ভাল উত্তর।
মাইকেল ডুরান্ট

@ মিশেলডুরান্ট - আমি ওপেন তাদের কাছে অনুরোধ করা খালি বিস্তৃত ইনলাইন সম্পাদনাগুলি জুড়েছি। এছাড়াও ওপি আই না ব্যবহার করার প্রয়োজনীয়তা নির্ধারণ করে sed। শেড এর মতো বিকল্পগুলি করার উপযুক্ত সরঞ্জাম এবং তিনি স্পষ্টতই এই সরঞ্জামগুলির ভূমিকাগুলি আরও ভালভাবে বোঝার জন্য জিজ্ঞাসা করছেন, সুতরাং কাউকে এই জিনিসগুলি খারাপ দেখানো দেখানোতে চূড়ান্ত শিক্ষা তাদের কেন। প্রচুর বারবার পিপিএল কেন কেবল তা ব্যাখ্যা না করে কেবল "এটি করবেন না" বলুন, তাই আমি আছি। তবে কেন আপনি ডিভি করছেন সে সম্পর্কে কমপক্ষে কোনও মন্তব্য করার জন্য ধন্যবাদ।
slm

অবশ্যই, আমি ভেবেছিলাম এটি অন্য সমস্ত ক্ষেত্রে একটি দুর্দান্ত উত্তর। হ্যাঁ আমি কোনও ব্যাখ্যা ছাড়াই -1 ঘৃণা করি।
মাইকেল ডুরান্ট

13

একক বর্ণের বিকল্পগুলির ক্লাসিক বিকল্প হ'ল trআদেশটি যা কোনও সিস্টেমের জন্য পাওয়া উচিত:

$ echo "foobar" | tr a b   
foobbr

trএটির চেয়ে sedআসলে ভাল যেহেতু একক বর্ণের বিকল্পগুলির জন্য sed(একা ছেড়ে দেওয়া perlবা awk) ব্যবহার করা উড়ে মারা মারার জন্য স্লেজ হাতুড়ি ব্যবহারের মতো।

grep এটি এর জন্য ডিজাইন করা হয়নি, এটি এর ইনপুটটি পরিবর্তন করে না, এটি কেবল এটির মাধ্যমে অনুসন্ধান করে।

বিকল্পভাবে, আপনি কয়েকটি শেলের বিকল্প ক্ষমতা ব্যবহার করতে পারেন । এখানে ব্যবহার ksh, zshবা bashশব্দবিন্যাস:

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr

আপনি কোন সমস্যার সমাধান করার চেষ্টা করছেন ঠিক তা যদি আপনি ব্যাখ্যা করেন তবে আমরা আপনাকে আরও নির্দিষ্ট উত্তর দিতে পারি।


ক্ষেত্রে উপেক্ষা করার কোন বিকল্প আছে ${foo//a/b}?
আলীকেলজিন-কিলাকা

@ অ্যালিকেলজিন-কিলাকা আমি ভয় করি না। তোমার মত আরো পরিশীলিত কিছু, উদাহরণস্বরূপ ব্যবহার করতে হবে: echo "$foo" | sed 's/a/b/iবা একটি অক্ষর বর্গ করা উচিত: echo ${foo//[aA]/b}
টেরডন

4

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

ex -s -c '%s/a/b/g|x' file
  1. % সমস্ত লাইন নির্বাচন করুন

  2. s বিকল্প

  3. g গ্লোবাল প্রতিস্থাপন

  4. x সংরক্ষণ করেন এবং বন্ধ করেন


দুর্দান্ত ধন্যবাদ কেবল যুক্ত করার জন্য, -c পতাকাটি হ'ল সম্পাদনা শুরু হওয়ার সাথে সাথে কমান্ডটি কার্যকর করা হয় (যেহেতু প্রাক্তন সম্পাদক হ'ল) ​​এবং -s পতাকাটি হয় স্ক্রিপ্ট মোডটি প্রতিক্রিয়া অক্ষম করে বা কেউ স্লিট-মোড বলতে পছন্দ করে। আরও তথ্যের জন্য রেফ: ex-vi.sourceforge.net/ex.html
জিমি এমজি লিম

3

আপনি যদি স্ট্রিমের পরিবর্তে কোনও ফাইলের সাথে কাজ করছেন তবে আপনি স্ট্যান্ডার্ড পাঠ্য সম্পাদক ব্যবহার করতে পারেন ed:

printf '%s\n' ',s/a/b/g' w q | ed file.txt

এটি যে কোনও * নিক্সে পাওয়া উচিত। কমা ইন প্রতিটি লাইনে কাজ করতে ',s/a/b/g'বলে (আপনি ব্যবহার করতে পারেন যা আপনি ভিমে ব্যবহার করেন তবে আরও পরিচিত হবে), এবং এর বাকি অংশটি একটি আদর্শ অনুসন্ধান এবং প্রতিস্থাপন। ফাইলটি লিখতে (সংরক্ষণ করতে) বলবে , প্রস্থান করতে বলবে।ed%wq

মনে রাখবেন, সেডের -iবিকল্পের (এবং অন্যান্য সরঞ্জামের অনুরূপ বিকল্পগুলি) এর বিপরীতে এটি অস্থায়ী ফাইলগুলির সাথে প্রতারণার পরিবর্তে প্রকৃতপক্ষে ফাইলটি সম্পাদনা করে।

আমি মনে করি না যে এটি স্ট্রিম দিয়ে কাজ করা সম্ভব, তবে তারপরে আমি সত্যিকার অর্থে খুব বেশি কিছু জানি না edএবং এটির যদি আসলে তার সামর্থ্য থাকে তবে আমি অবাক হব না (ইউনিক্সের দর্শনের যা হ'ল)।


2

পূর্বপুরুষ কমান্ড ব্যবহার করা (যার -sঅর্থ শান্ত (নিঃশব্দ) এবং কমান্ডগুলির আগে কমাটি সমস্ত লাইনে কার্যকর করা হয়):

কেবল স্টাডিউটে মুদ্রণ :

ed -s file <<!
,s/a/b/g
,p
q
!

জায়গায় জায়গায় প্রতিস্থাপন:

ed -s file <<!
,s/a/b/g
w
q
!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.