কমান্ড ব্যবহার করে কোনও ফাইলের মধ্যে পাঠ্য সন্ধান করুন এবং প্রতিস্থাপন করুন

কমান্ড লাইন ব্যবহার করে আমি কীভাবে কোনও পাঠ্য ফাইলে নির্দিষ্ট শব্দগুলি সন্ধান এবং প্রতিস্থাপন করতে পারি?

sed -i 's/original/new/g' file.txt

ব্যাখ্যা:

  • sed = স্ট্রিম সম্পাদক
  • -i = ইন-প্লেস (অর্থাত্ মূল ফাইলে সংরক্ষণ করুন)
  • কমান্ড স্ট্রিং:

    • s = বিকল্প কমান্ড
    • original = প্রতিস্থাপন করার জন্য শব্দটি বর্ণনা করে একটি নিয়মিত অভিব্যক্তি (বা কেবল শব্দটি নিজেই)
    • new = টেক্সট সঙ্গে এটি প্রতিস্থাপন
    • g = গ্লোবাল (অর্থাত্ সমস্ত প্রতিস্থাপন করুন এবং কেবল প্রথম ঘটনাটি নয়)
  • file.txt = ফাইলের নাম

এটা অর্জন করার উপায় বৃন্দ আছে. স্ট্রিং প্রতিস্থাপনের সাথে কেউ কী অর্জন করার চেষ্টা করে তার জটিলতার উপর নির্ভর করে এবং ব্যবহারকারীর পরিচিত সরঞ্জামগুলির উপর নির্ভর করে কিছু পদ্ধতি অন্যের চেয়ে বেশি পছন্দ করা যেতে পারে

এই উত্তরে আমি সহজ ব্যবহার করছি input.txt আপনি এখানে দেওয়া সব উদাহরণ পরীক্ষা করতে ব্যবহার করতে পারেন, যা ফাইল. ফাইলের বিষয়বস্তু:

roses are red , violets are blueThis is an input.txt and this doesn't rhyme

বাশ

বাশ সত্যিই পাঠ্য প্রক্রিয়াকরণের জন্য বোঝানো হয় না, তবে সহজ বিকল্পগুলি এর মাধ্যমে করা যেতে পারে পরামিতি সম্প্রসারণ , বিশেষত এখানে আমরা সাধারণ কাঠামো ব্যবহার করতে পারি ${parameter/old_string/new_string}.

#!/bin/bashwhile IFS= read -r linedo    case "$line" in       *blue*) printf "%s\n" "${line/blue/azure}" ;;       *) printf "%s\n" "$line" ;;    esacdone < input.txt

এই ছোট স্ক্রিপ্টটি স্থান-প্রতিস্থাপন করে না, যার অর্থ আপনাকে নতুন ফাইলে নতুন পাঠ্য সংরক্ষণ করতে হবে এবং পুরানো ফাইল থেকে মুক্তি পেতে হবে, বা mv new.txt old.txt

সাইড নোট: আপনি কেন সম্পর্কে আগ্রহী হন while IFS= read -r ; do ... done < input.txt এটি লাইন ফাইল লাইন পড়া মূলত শেল এর উপায়, ব্যবহার করা হয়. দেখা এই রেফারেন্সের জন্য.

এডব্লিউকে

এডব্লিউকে, একটি টেক্সট প্রসেসিং ইউটিলিটি হচ্ছে, যেমন কাজের জন্য বেশ উপযুক্ত. এটি সাধারণ প্রতিস্থাপন এবং এর উপর ভিত্তি করে আরও অনেক উন্নত করতে পারে রেগুলার এক্সপ্রেশন. এটি দুটি ফাংশন সরবরাহ করে: sub() এবং gsub(). প্রথম এক শুধুমাত্র শুধুমাত্র প্রথম সংঘটন প্রতিস্থাপন, যখন দ্বিতীয়-পুরো স্ট্রিং ঘটনার প্রতিস্থাপন. উদাহরণস্বরূপ, যদি আমরা স্ট্রিং আছে one potato two potato , এই ফলাফল হবে:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'one banana two banana$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      one banana two potato 

এডব্লিউকে যুক্তি হিসাবে একটি ইনপুট ফাইল নিতে পারে, তাই একই জিনিসগুলি করে input.txt , সহজ হবে:

awk '{sub(/blue/,"azure")}1' input.txt

এডব্লিউকে সংস্করণের উপর নির্ভর করে আপনার কাছে এটি স্থান সম্পাদনা করতে পারে বা নাও থাকতে পারে, তাই স্বাভাবিক অনুশীলন নতুন পাঠ্য সংরক্ষণ করুন এবং প্রতিস্থাপন করুন. উদাহরণস্বরূপ এই মত কিছু:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

এসইডি

সেড একটি লাইন সম্পাদক. এটি নিয়মিত এক্সপ্রেশনগুলিও ব্যবহার করে তবে সাধারণ বিকল্পগুলির জন্য এটি করা যথেষ্ট:

sed 's/blue/azure/' input.txt

এই সরঞ্জামটি সম্পর্কে যা ভাল তা হ ' ল এটিতে স্থান-সম্পাদনা রয়েছে, যা আপনি সক্ষম করতে পারেন -i পতাকা.

পার্ল

পার্ল প্রায়ই টেক্সট প্রক্রিয়াকরণের জন্য ব্যবহার করা হয়, যা অন্য টুল, কিন্তু এটি একটি সাধারণ উদ্দেশ্য ভাষা, এবং নেটওয়ার্কিং, সিস্টেম প্রশাসন, ডেস্কটপ অ্যাপ্লিকেশন, এবং অন্যান্য অনেক জায়গায় ব্যবহার করা হয়. এটি অন্যান্য ভাষা যেমন সি থেকে প্রচুর ধারণা/বৈশিষ্ট্য ধার করেছে, সেড, এডাব্লুকে, এবং অন্যদের. সহজ প্রতিস্থাপন তাই হিসাবে করা যেতে পারে:

perl -pe 's/blue/azure/' input.txt

সেডের মতো পার্লেরও রয়েছে-আমি পতাকা.

পাইথন

এই ভাষা খুব বহুমুখী এবং অ্যাপ্লিকেশন বিভিন্ন ব্যবহার করা হয়. স্ট্রিংগুলির সাথে কাজ করার জন্য এটির অনেকগুলি ফাংশন রয়েছে, যার মধ্যে রয়েছে replace(), সুতরাং আপনার যদি পরিবর্তনশীল থাকে var="Hello World" , আপনি করতে পারেন var.replace("Hello","Good Morning")

সহজ উপায় ফাইল পড়া এবং এটি স্ট্রিং প্রতিস্থাপন হিসাবে তাই হবে:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

পাইথন সঙ্গে, তবে , আপনি স্ক্রিপ্ট নিজেই মধ্যে থেকে কি করতে পারেন, যা নতুন ফাইল, আউটপুট প্রয়োজন. উদাহরণস্বরূপ, এখানে একটি সহজ এক:

#!/usr/bin/env pythonimport sysimport osimport tempfiletmp=tempfile.mkstemp()with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:    for line in fd1:        line = line.replace('blue','azure')        fd2.write(line)os.rename(tmp[1],sys.argv[1])

এই স্ক্রিপ্ট সঙ্গে বলা হবে input.txt কমান্ড লাইন যুক্তি হিসাবে কমান্ড-লাইন আর্গুমেন্ট সহ পাইথন স্ক্রিপ্ট চালানোর সঠিক কমান্ডটি হবে

 $ ./myscript.py input.txt

অথবা

$ python ./myscript.py input.txt

অবশ্যই, নিশ্চিত করুন যে ./myscript.py আপনার বর্তমান কাজ ডিরেক্টরির মধ্যে এবং প্রথম উপায় জন্য, এটি সঙ্গে এক্সিকিউটেবল সেট করা হয় তা নিশ্চিত করুন chmod +x ./myscript.py

পাইথন এছাড়াও নিয়মিত এক্সপ্রেশন থাকতে পারে, বিশেষ করে, আছে re মডিউল, যা আছে re.sub() ফাংশন, যা আরো উন্নত প্রতিস্থাপন জন্য ব্যবহার করা যেতে পারে.

এই কাজ করতে বিভিন্ন উপায়ে একটি নম্বর আছে. এক ব্যবহার করা হয় sed রেজেক্স সেড ফিল্টারিং এবং টেক্সট রূপান্তর জন্য একটি স্ট্রিম এডিটর. নিম্নরূপ একটি উদাহরণ:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orlymarco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarlymarco@imacs-suck: ~$ cat yarlyThe quick brown unicorn jumped over the hyper sleeping dog

আর একটি উপায় যা এর চেয়ে বেশি অর্থবোধ করতে পারে < strin এবং > strout পাইপ দিয়ে হয়!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowaimarco@imacs-suck: ~$ cat nowai The quick brown fox jumped over the lazy sleeping dog

এডাব্লুকে জিএসইউবি কমান্ডের মাধ্যমে,

awk '{gsub(/pattern/,"replacement")}' file

উদাহরণ:

awk '{gsub(/1/,"0");}' file

উপরোক্ত উদাহরণে, সব 1 এর 0 এর নির্বিশেষে কলাম যেখানে এটি অবস্থিত দ্বারা প্রতিস্থাপিত হয়.


আপনি যদি কোনও নির্দিষ্ট কলামে প্রতিস্থাপন করতে চান তবে এটির মতো করুন,

awk '{gsub(/pattern/,"replacement",column_number)}' file

উদাহরণ:

awk '{gsub(/1/,"0",$1);}' file

এটি শুধুমাত্র প্রথম কলামে 1 সঙ্গে 0 প্রতিস্থাপন.

পার্ল মাধ্যমে,

$ echo 'foo' | perl -pe 's/foo/bar/g'bar

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

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

  2. s বিকল্প

  3. g প্রতিটি লাইনের সমস্ত উদাহরণ প্রতিস্থাপন করুন

  4. x পরিবর্তন করা হয়েছে (তারা আছে) এবং প্রস্থান যদি লিখুন

sed হয় sট্রামের এডআইটিওআর, যে আপনি ব্যবহার করতে পারেন | (পাইপ) পাঠাতে স্ট্যান্ডার্ড স্ট্রিম (বিশেষত স্টডিন এবং স্টডআউট) এর মাধ্যমে sed এবং ইউনিক্স দর্শনের ঐতিহ্য এটি একটি সহজ টুল তৈরীর, মাছি প্রোগ্রামগতভাবে তাদের পরিবর্তন; কিন্তু সরাসরি ফাইল সম্পাদনা করতে পারেন, খুব, ব্যবহার করে -i পরামিতি নিচে উল্লিখিত.
নিম্নলিখিত বিবেচনা করুন:

sed -i -e 's/few/asd/g' hello.txt

s/ ব্যবহার করা হয় sপাওয়া অভিব্যক্তিটি উপজাত করুন few সঙ্গে asd:

কয়েক, সাহসী.


সাহসী, সাহসী

/g পুরো লাইন জন্য এই কাজ করতে, যার অর্থ, "গ্লোবাল" ঘোরা. আপনি বন্ধ ছেড়ে যদি /g (সঙ্গে s/few/asd/, যাই হোক না কেন সর্বদা তিনটি স্ল্যাশ হওয়া দরকার) এবং few একই লাইনে দু ' বার প্রদর্শিত হবে, কেবল প্রথম few পরিবর্তিত হয় asd:

কয়েক পুরুষ, কয়েক নারী, সাহসী.


এএসডি পুরুষদের, কয়েক নারী, সাহসী.

এটি কিছু পরিস্থিতিতে দরকারী, যেমন লাইনের শুরুতে বিশেষ অক্ষর পরিবর্তন করা (উদাহরণস্বরূপ, কিছু লোক একটি অনুভূমিক ট্যাব সহ ইমেল থ্রেডে পূর্ববর্তী উপাদান উদ্ধৃত করার জন্য ব্যবহার করে এমন বৃহত্তর প্রতীকগুলি প্রতিস্থাপন করে উদ্ধৃত বীজগণিত বৈষম্য পরে লাইনে অস্পৃশ্য), তবে আপনার উদাহরণে যেখানে আপনি এটি নির্দিষ্ট করেছেন কোথাও few ঘটে এটা প্রতিস্থাপন করা উচিত, নিশ্চিত করুন যে আপনি যে /g.

নিম্নলিখিত দুটি বিকল্প (পতাকা) এক মধ্যে একত্রিত করা হয়, -ie:

-i অপশন সম্পাদনা করতে ব্যবহার করা হয় iফাইল এন স্থান hello.txt.

-e বিকল্পটি নির্দেশ করে eএই ক্ষেত্রে চালানোর জন্য এক্সপ্রেশন/কমান্ড s/.

দ্রষ্টব্য: আপনি ব্যবহার করা গুরুত্বপূর্ণ -i -e অনুসন্ধান / প্রতিস্থাপন. আপনি যদি -ie, আপনি চিঠি 'ই' যুক্ত সঙ্গে প্রতিটি ফাইলের একটি ব্যাকআপ তৈরি.

আপনি এই মত করতে পারেন:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

উদাহরণ: সমস্ত উপস্থিতি প্রতিস্থাপন [লগডির',"] (ছাড়া []) সঙ্গে [লগডির', ওএস.গেটসিডাব্লুডি ()] সনাক্ত কমান্ডের ফলাফল প্রাপ্ত সমস্ত ফাইলে, করুন:

এক্স 1:

locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"

এক্স 2:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

কোথায় [tensorboard/program.py] অনুসন্ধান করার জন্য ফাইল