লিনাক্স কমান্ড লাইনে একাধিক ফাইলের স্ট্রিং কীভাবে প্রতিস্থাপন করা যায়


460

আমাকে কেবল sshএকটি সার্ভারে অ্যাক্সেস সহ একটি ফোল্ডারে প্রচুর ফাইলের স্ট্রিং প্রতিস্থাপন করতে হবে। কিভাবে আমি এটি করতে পারব?

উত্তর:


601
cd /path/to/your/folder
sed -i 's/foo/bar/g' *

"ফু" এর ঘটনাগুলি "বার" দিয়ে প্রতিস্থাপন করা হবে।

ম্যাকোসের মতো বিএসডি সিস্টেমে আপনাকে ম্যানপেজ অনুযায়ী ব্যাকআপ এক্সটেনশন সরবরাহ করতে হবে -i '.bak'অথবা অন্যথায় "ঝুঁকিপূর্ণ দুর্নীতি বা আংশিক সামগ্রী" সরবরাহ করতে হবে।

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *

13
স্ট্রিংটিতে সাদা স্পেস বা বিশেষ অক্ষর থাকলে এটি আমার পক্ষে কাজ করবে বলে মনে হয় না। কেন এমন হতে পারে এমন কোনও ধারণা, বা কীভাবে আমি তাদের পালাতে হবে? ধন্যবাদ!
ম্যাথু হার্বস্ট

13
আমার সংস্করণের জন্য অন্তত sed, -iপরে একটি স্ট্রিং, যা পুরাতন ফাইলের নাম সংযোজন করা হয় প্রয়োজন। সুতরাং sed -i .bak 's/foo/bar/g' *.xxসমস্ত .xxফাইলকে সমমানের .xx.bakনামে সরিয়ে নিয়ে যায় এবং তারপরে .xxfoo → বার বিকল্পের সাথে ফাইলগুলি উত্পন্ন করে ।
এনাফরি

24
যদি কেউ আরও বিকল্পগুলির সন্ধান করতে চান তবে ইউনিক্স স্ট্যাক এক্সচেঞ্জের একটি উত্তর রয়েছে যা আরও ব্যবহারের ক্ষেত্রে সাইট কভার করে covers াকা দেয় unix.stackexchange.com/a/112024/13488
রেড্ডি

19
স্থান থেকে বাঁচতে @ ম্যাথহেহবার্স্ট, পছন্দ করুন sed -i 's/foo\ with\ spaces/bar/g' *। আমি মনে করি আপনি এত দিন পরে খুঁজে পেয়েছেন ... তবে এইভাবে অন্যদের একই সমস্যাটি খুঁজে পাওয়া যায়।
ম্যানুয়েলভিগার্চিয়া

5
পুনরাবৃত্তির কিছু জন্য আপনি নিম্নলিখিত চেষ্টা করতে পারেন। নোট করুন যে ফাইলগুলির তালিকা বিশাল হলে এটি কাজ করে না। sed -i -e 's/foo/bar/g' $(find /home/user/base/dir)
স্কট

243

কাস্পারের উত্তরের মতো তবে একটি লাইনে সমস্ত উপস্থিতি প্রতিস্থাপনের জন্য জি পতাকা সহ

find ./ -type f -exec sed -i 's/string1/string2/g' {} \;

সংবেদনশীল বৈশ্বিক ক্ষেত্রে:

find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;

23
আপনি যদি ওএসএক্সে থাকেন এবং আপনার নিদর্শনগুলিতে বিন্দু থাকতে পারে এবং আপনি স্থানস্থ প্রতিস্থাপন চান (কোনও ব্যাকআপ ফাইল নেই) আপনার ব্যবহার করা উচিত LC_ALL=C find ./ -type f -exec sed -i '' -e 's/proc.priv/priv/g' {} \;( এই পোস্টটি এবং এটি দেখুন )
জোনাথন এইচ

2
এটি অবশ্যই আমার পক্ষে কাজ করেছে, কারণ এটি "* .js" '
মার্সেলো দে সেলস

1
একটি ভার্বোজের বিকল্পটি দুর্দান্ত হবে তবে পরিবর্তনগুলি হয়েছে কিনা তা দেখতে আপনি কেবল গ্রেপ করতে পারেন। দ্রষ্টব্য: ওয়াইল্ডকার্ডের জন্য, '-name "*। Php"' চেষ্টা করুন এবং পুনরাবৃত্তি এবং ওয়াইল্ডকার্ড সহ গ্রেপ খারাপ, আপনাকে --include=*.whatever-r দিয়ে যুক্ত করতে হবে
পিজে ব্রুনেট

12
চেক-আউট গিট রেপোর মূল থেকে এটি করবেন না। আপনি দুর্ঘটনাক্রমে এর ডাটাবেসটিকে দূষিত করতে পারেন .git/cdনিচের স্তরে নেমে যেতে ভুলবেন না ।
এরিকপ্রাইস

1
আমি শুধু আমার Git রেপো তে এটা করেছে এবং এখন git statusফেরৎ: error: bad index file sha1 signature.... fatal: index file corrupt। কি দেয়?
জ্বিন

164

@ কেভের উত্তরটি ভাল, তবে কেবল তাত্ক্ষণিক ডিরেক্টরিতে থাকা ফাইলগুলিকেই প্রভাবিত করে below নীচের উদাহরণটি পুনরাবৃত্তভাবে ফাইলগুলি খুঁজে পেতে গ্রেপ ব্যবহার করে। এটি আমার জন্য প্রতিটি সময় কাজ করে।

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

কমান্ড ভাঙ্গা

grep -r : --recursive , প্রতিটি ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফাইল পড়ুন। গ্রেপ-
এল : -প্রিন্ট-উইথ ম্যাচগুলি , প্রতিটি ফাইলের মিল মেলে এমন লাইনগুলি মুদ্রণের পরিবর্তে একটি ম্যাচ রয়েছে তার নাম মুদ্রণ করে।
, grep -i : --ignore-কেস

xargs : STDIN কে আর্গুমেন্টে রূপান্তর করুন, এই উত্তরটি অনুসরণ করুন ।
xargs -i @ ~ কমান্ড ধারণ করে @ ~ : যুক্তি জন্য একটি স্থানধারক একটি নির্দিষ্ট অবস্থানে ব্যবহার করা ~ কমান্ড ~ , @ চিহ্ন একটি স্থানধারক যা কোন স্ট্রিং দ্বারা প্রতিস্থাপিত পারে।

সেড- i : ব্যাকআপ ব্যতীত , জায়গায় ফাইল সম্পাদনা করুন।
সেড এস / রেজিএক্সপ্স / রিপ্লেসমেন্ট / : রিপ্লেসমেন্টের সাথে স্ট্রিং ম্যাচিং রেজিএক্সপেক্ট । সেড এস / রেজিএক্সপ্স / রিপ্লেসমেন্ট / জি : গ্লোবাল , কেবলমাত্র প্রথম ম্যাচের পরিবর্তে প্রতিটি ম্যাচের জন্য বিকল্প তৈরি করুন।


13
এটি আমার পক্ষে কাজ করে নি, তবে এটি করেছে:grep --include={*.php,*.html,*.js} -rnl './' -e "old-word" | xargs -i@ sed -i 's/old-word/new-word/g' @
ডেনিস

7
@pymarco আপনি কি এই আদেশটি ব্যাখ্যা করতে পারেন? আমি জানি না কেন আপনাকে কেবল সেড ব্যবহারের পরিবর্তে xargs ব্যবহার করতে হয়েছিল |, কেন -i, xargs কমান্ডে? আমি ম্যানুয়ালটিতে পড়েছি এটি অবহিত এবং -Iপরিবর্তে ব্যবহার করা উচিত । এবং @প্যাটার্নের জন্য শুরু এবং শেষের জন্য একটি সীমানা হিসাবে ব্যবহৃত হয়?
এডসন হোরাসিও জুনিয়র

2
প্রশ্নটি যদিও বিশেষত লিনাক্সের জন্য।
পাইমারকো

5
অস্পষ্টে এটি ঠিক আছে:grep -rli 'old-word' * | xargs -I@ sed -i '' 's/2.0.0/latest/g' @
ফিলিপ সুলতান

1
যদি আপনি কয়েকটি বিকল্প ( rli) এবং @চিহ্নটি ভেঙে দেন তবে এটি দুর্দান্ত হবে
রায়মসনসন

37

এটি আমার পক্ষে কাজ করেছে:

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

Howerver, এই নি: sed -i 's/string1/string2/g' *। সম্ভবত "foo" স্ট্রিং 1 এবং "বার" স্ট্রিং 2 নয় to


1
এটি সেহেতু ওয়াইল্ডকার্ডকে * আলাদাভাবে আচরণ করে। [এবিসি] * এর অর্থ সেট {এ, বি, সি of এর অক্ষরের একটি নির্বিচার সংখ্যা} [a-z0-9] * ওয়াইল্ডকার্ডের মতো * কাজ করে।
thepiercingarrow

8
ওএসএক্স ব্যবহারে:find ./ -type f -exec sed -i '' -e 's/string1/string2/' {} \;
শাহীন গিয়াসি

32

ইতিমধ্যে তালিকাবদ্ধ এটির জন্য কয়েকটি মানক উত্তর রয়েছে। সাধারণত, আপনি ব্যবহার করতে পারেন খোঁজ ফাইল যাও recursively লিস্টে এবং তারপর সঙ্গে অপারেশন না sed বা Perl

বেশিরভাগ দ্রুত ব্যবহারের জন্য, আপনি rpl কমান্ডটি মনে রাখার চেয়ে অনেক সহজ মনে করতে পারেন। এখানে প্রতিস্থাপন (foo -> বার) সমস্ত ফাইলের পুনরাবৃত্তভাবে দেওয়া হচ্ছে:

rpl -R foo bar .

আপনার সম্ভবত এটি ইনস্টল করতে হবে ( apt-get install rplবা অনুরূপ)।

যাইহোক, নিয়মিত অভিব্যক্তি এবং পিছনের বিকল্পের সাথে যুক্ত ফাইলগুলির নাম, বা ফাইলের নাম এবং সেইসাথে অনুসন্ধান-এবং-প্রতিস্থাপন জড়িত এমন কঠোর কাজের জন্য, আমি যে সাধারণ এবং শক্তিশালী সরঞ্জাম সম্পর্কে অবগত রয়েছি তা হ'ল পুনর্নবীকরণ , একটি ছোট পাইথন স্ক্রিপ্ট আমি কিছুক্ষণ আগে লিখেছিলাম নাম পরিবর্তন এবং রিফ্যাক্টরিং কাজগুলি thornier। যে কারণে আপনি এটি পছন্দ করতে পারেন তা হ'ল:

  • ফাইলের নাম পরিবর্তনের পাশাপাশি ফাইলের সামগ্রীগুলিতে অনুসন্ধান এবং প্রতিস্থাপনকে সমর্থন করে।
  • অনুসন্ধান এবং প্রতিস্থাপনের প্রতিশ্রুতিবদ্ধ হওয়ার আগে পরিবর্তনগুলি দেখুন।
  • পিছনে প্রতিস্থাপন, পুরো শব্দ, কেস সংবেদনশীল এবং কেস সংরক্ষণ (নিয়মিত foo -> বার, ফু -> বার, FOO -> বার) মোডগুলি সহ নিয়মিত অভিব্যক্তি সমর্থন করুন Support
  • অদলবদল (foo -> বার এবং বার -> ফু) বা অ-অনন্য প্রতিস্থাপনের সেট (foo -> বার, চ -> এক্স) সহ একাধিক প্রতিস্থাপনের সাথে কাজ করে।

এটি ব্যবহার করতে pip install repren,। উদাহরণগুলির জন্য README পরীক্ষা করুন


1
বাহ, পুনঃপ্রবৃত্তি দুর্দান্ত! ক্লাসের নাম, পদ্ধতি এবং ভেরিয়েবলের ভিতরে শব্দের কিছু অংশ পরিবর্তনের জন্য এটি 1000+ C ++ শিরোনাম এবং উত্স ফাইলগুলির সাথে মিল রেখে ফাইলগুলির নাম পরিবর্তন করতে ব্যবহৃত হয়েছিল এবং এটি প্রথমবারের সাথে একটি কমান্ডের সাথে পুরোপুরি কাজ করে। ধন্যবাদ!
বব কোসিস্কো

29

একাধিক ফাইলের একটি স্ট্রিং প্রতিস্থাপন করতে আপনি ব্যবহার করতে পারেন:

grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'

যেমন

grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

উত্স ব্লগ


20

ফাইলগুলির মধ্যে কোনও পাথ প্রতিস্থাপন করতে (পালানোর অক্ষরগুলি এড়ানো) আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

sed -i 's@old_path@new_path@g'

@ সাইন এর মানে হল যে নিম্নলিখিত অক্ষরে সমস্ত বিশেষ অক্ষরকে উপেক্ষা করা উচিত।


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

19

যদি আপনার স্ট্রিংটিতে ফরোয়ার্ড স্ল্যাশ থাকে (/), আপনি ডিলিমেটারটি '+' এ পরিবর্তন করতে পারেন।

find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +

এই কমান্ডটি বর্তমান ডিরেক্টরিতে পুনরাবৃত্তভাবে চলবে।


ধন্যবাদ! এর উল্লেখের একটি লোড পরিবর্তন ../domain.comকরতে সহায়তা করেছেdomain.com
জ্যাক রজার্স

12

"ফু" এর প্রথম লাইনের উপস্থিতিগুলিকে "বার" দিয়ে প্রতিস্থাপন করা হবে। এবং আপনি দ্বিতীয় লাইনটি পরীক্ষা করে দেখতে পারেন।

grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
grep 'foo' -r * | awk -F: {'print $1'} | sort -n | uniq -c

6
আপনি কেন আপনার ব্লগে লিঙ্ক করছেন? এটিতে আপনার উত্তরের মতো একই পাঠ্য রয়েছে।
ডেভিডপস্টিল

1
আমি পছন্দ করিgrep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
প্রচি 21

10

আপনার যদি ফাইলগুলির তালিকা থাকে তবে আপনি ব্যবহার করতে পারেন

replace "old_string" "new_string" -- file_name1 file_name2 file_name3

আপনার কাছে সমস্ত ফাইল থাকলে আপনি ব্যবহার করতে পারেন

replace "old_string" "new_string" -- *

এক্সটেনশন সহ আপনার ফাইলগুলির তালিকা থাকলে আপনি ব্যবহার করতে পারেন

replace "old_string" "new_string" -- *.extension

2
আসলে, "-" ফাইলটি কেবল "-" হওয়া উচিত, কমপক্ষে আমার সংস্করণে
সরল ব্যবহারকারী

4
এই ইউটিলিটি মাইএসকিউএল প্যাকেজগুলির মধ্যে বিতরণ করা হয়।
দিমিত্রি জিনজবার্গ

2
যদিও আমি সমাধানটির প্রশংসা করতে চাই, যা নিয়মিত অভিব্যক্তি হিসাবে নিয়মিত লাইন উদ্ধৃতি না করে কাজ করে।
দিমিত্রি জিনজবার্গ

1
এটি দুর্দান্ত কাজ করে - এবং যদি আপনি একাধিক ফাইলে সমস্ত স্ট্রিং প্রতিস্থাপন করতে চান যা ".txt" হিসাবে শেষ হয়, আপনি কেবল পারেনreplace "old_string" "new_string" -- *.txt
tsveti_iko

1
এই replaceইউটিলিটিটি কোথা থেকে পাবেন তা যুক্ত করা ভাল । এই তথ্য ব্যতীত, এই উত্তরটি অসম্পূর্ণ।
সীতেশ

7

"আপনি সন্ধান এবং সেড ব্যবহার করতে পারেন তবে আমি দেখতে পেয়েছি যে পার্লের এই ছোট্ট রেখাটি দুর্দান্তভাবে কাজ করে।

perl -pi -w -e 's/search/replace/g;' *.php
  • - এর অর্থ নিম্নলিখিত কোডের লাইনটি কার্যকর করা।
  • -i মানে জায়গাটিতে সম্পাদনা করা
  • -আমরা সাবধানবাণী লিখি
  • -পি লুপ

"( Http://www.liamdelahunty.com/tips/linux_search_and_replace_m Multipleple_files.php থেকে নেওয়া )

আমার সেরা ফলাফলগুলি পার্ল এবং গ্রেপ ব্যবহার করে আসে (সেই ফাইলটির সন্ধানের এক্সপ্রেশন রয়েছে তা নিশ্চিত করতে)

perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )

7

আপনি স্ট্রিংটি অনুসন্ধান করতে চান searchএবং replaceএকাধিক ফাইল জুড়ে এটি প্রতিস্থাপন করতে চান , এটি আমার যুদ্ধ-পরীক্ষিত, এক-লাইন সূত্র :

grep -RiIl 'search' | xargs sed -i 's/search/replace/g'

দ্রুত গ্রেপ ব্যাখ্যা:

  • -R - পুনরাবৃত্ত অনুসন্ধান
  • -i - কেস-সংবেদনশীল
  • -I - বাইনারি ফাইলগুলি এড়িয়ে যান (আপনি কি টেক্সট চান, তাই না?)
  • -l- আউটপুট হিসাবে একটি সহজ তালিকা মুদ্রণ করুন। অন্যান্য কমান্ডের প্রয়োজন

তারপরে গ্রেপ আউটপুটটি সেডে পাইপ করা হয় (xargs এর মাধ্যমে) যা আসলে পাঠ্য প্রতিস্থাপনের জন্য ব্যবহৃত হয়। -iপতাকা সরাসরি ফাইল পরিবর্তিত হবে। এক ধরণের "ড্রাই ড্রাই" মোডের জন্য এটি সরান।


4

এই প্রশ্নটি (এবং উত্তর) খুঁজে পাওয়ার আগে আমি আমার নিজের সমাধানটি একত্রিত করেছি। আমি "প্রতিস্থাপন" "বেশ কয়েকটি" এবং "এক্সএমএল" এর বিভিন্ন সংমিশ্রণের জন্য অনুসন্ধান করেছি কারণ এটি আমার অ্যাপ্লিকেশন, তবে এই নির্দিষ্টটিটি খুঁজে পেল না।

আমার সমস্যা: আমার কাছে জটিল বিষয়বস্তুযুক্ত পরীক্ষার ক্ষেত্রে ডেটা সহ বসন্তের এক্সএমএল ফাইল ছিল। জাভা উত্স কোডের একটি রিফ্যাক্টর প্রচুর ক্লাস পরিবর্তন করে এবং এক্সএমএল ডেটা ফাইলগুলিতে প্রয়োগ করে না। পরীক্ষার কেসগুলির ডেটা সংরক্ষণ করার জন্য, আমাকে বেশ কয়েকটি ডিরেক্টরিতে বিতরণ করা সমস্ত এক্সএমএল ফাইলগুলিতে সমস্ত শ্রেণীর নাম পরিবর্তন করতে হবে। মূল এক্সএমএল ফাইলগুলির ব্যাকআপ কপিগুলি সংরক্ষণ করার সময় (যদিও এটি আবশ্যক ছিল না, কারণ সংস্করণ নিয়ন্ত্রণ আমাকে এখানে সংরক্ষণ করবে)।

আমি find+ এর কিছু সংমিশ্রণের সন্ধান করছিলাম sed, কারণ এটি অন্যান্য পরিস্থিতিতে আমার জন্য কাজ করেছিল, তবে একসাথে বেশ কয়েকটি প্রতিস্থাপনের সাথে নয়।

তারপরে আমি উবুন্টুকে প্রতিক্রিয়া জিজ্ঞাসা করেছিলাম এবং এটি আমার কমান্ড লাইনটি তৈরি করতে সহায়তা করেছে:

find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

এবং এটি পুরোপুরি কাজ করেছে (ভাল, আমার ক্ষেত্রে ছয়টি আলাদা প্রতিস্থাপন ছিল)। তবে দয়া করে মনে রাখবেন এটি বর্তমান ডিরেক্টরি অনুসারে সমস্ত * .xML ফাইলগুলিকে স্পর্শ করবে। সে কারণে এবং আপনি যদি কোনও সংস্করণ নিয়ন্ত্রণ সিস্টেমে দায়বদ্ধ হন তবে আপনি প্রথমে ফিল্টার করতে পারেন এবং কেবল sedআপনার পছন্দসই স্ট্রিংগুলি রেখে যেতে চান; মত:

find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

এবং উইন্ডোগুলির জন্য, আমি সন্ধান করেছি যে স্ট্রিংটি খুঁজে পাওয়ার একটি উপায় রয়েছে - এটি কীভাবে প্রতিস্থাপন করা যায় তা পরীক্ষা করে দেখুন না - এক কমান্ডে: findstr /spin /c:"quéquieresbuscar" *.xml এটি কার্যকর হবে।
ম্যানুয়েলভিগার্চিয়া


3

সত্যিই খোঁড়া, তবে ওএসএক্সে ডান কাজ করার জন্য আমি কোনও সিড কমান্ড পাইনি, সুতরাং আমি পরিবর্তে এই বোবা জিনিসটি করেছি:

:%s/foo/bar/g
:wn

^ - এই তিনটি লাইনটি আমার ক্লিপবোর্ডে অনুলিপি করুন (হ্যাঁ, শেষের লাইনটি অন্তর্ভুক্ত করুন), তারপরে:

vi *

এবং কমান্ড-ভি চেপে ধরে রাখুন যতক্ষণ না এটি বলে যে কোনও ফাইল নেই।

বোবা ... হল hacky ... কার্যকর ...


3

একটি ম্যাকবুক প্রোতে আমি নিম্নলিখিতটি ব্যবহার করেছি ( https://stackoverflow.com/a/19457213/6169225 দ্বারা অনুপ্রাণিত ):

sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *

-i '' আপনি কোনও ব্যাকআপ নিচ্ছেন না তা নিশ্চিত করবে।

-e আধুনিক রেজেক্সের জন্য।


3
-eশুধু সেডকে বলে যে পরের টোকেনটি একটি কমান্ড। বর্ধিত নিয়মিত এক্সপ্রেশনগুলির জন্য, -Eপরিবর্তে ব্যবহার করুন।
বেনিয়ামিন ডাব্লু।

2

স্ট্রিম এডিটরটি একাধিক ফাইলগুলিকে "অন্তর্নিহিত" পরিবর্তন করে যখন -iস্যুইচটি সঞ্চারিত হয় , যা একটি ব্যাকআপ ফাইল আর্গুমেন্ট হিসাবে শেষ হয়। সুতরাং

sed -i.bak 's/foo/bar/g' *

এই ফোল্ডারে সমস্ত ফাইলের fooসাথে প্রতিস্থাপন barকরে তবে সাবফোল্ডারে নেমে আসে না। এটি .bakআপনার ডিরেক্টরিতে প্রতিটি ফাইলের জন্য একটি নতুন ফাইল তৈরি করবে । এই ডিরেক্টরিতে এবং এর সমস্ত উপ-ডিরেক্টরিগুলির সমস্ত ফাইলের জন্য এটি পুনরাবৃত্তভাবে findকরতে, ডিরেক্টরি ট্রিটিকে অতিক্রম করার জন্য আপনার একটি সহায়ক প্রয়োজন ।

find ./ -print0 | xargs -0 sed -i.bak 's/foo/bar/g' *

findfind ./ -name '*.php' -or -name '*.html' -print0প্রয়োজনে আরও যুক্তি যুক্ত করে নির্দিষ্ট ফাইলগুলি পরিবর্তন করে কী ফাইলগুলিতে আপনাকে আরও বিধিনিষেধ দেয় ।


দ্রষ্টব্য: জিএনইউতে sedকোনও ফাইল সমাপ্তির প্রয়োজন হয় না sed -i 's/foo/bar/g' *, পাশাপাশি কাজ করবে; ফ্রিবিএসডি sedএকটি বর্ধনের দাবি জানায়, তবে এর মধ্যে একটি স্থানের অনুমতি দেয়, তাই sed -i .bak s/foo/bar/g *কাজ করে।


2

মাল্টিডিট কমান্ডের জন্য স্ক্রিপ্ট

multiedit [-n PATTERN] OLDSTRING NEWSTRING

কাস্পারের উত্তর থেকে আমি কমান্ড লাইন আর্গুমেন্টগুলি গ্রহণ করতে এবং বিকল্পভাবে একটি প্যাটার্নের সাথে মেলে ফাইলের নামগুলি সীমাবদ্ধ করতে বাশ স্ক্রিপ্ট তৈরি করেছি। আপনার AT PATH এ সংরক্ষণ করুন এবং সম্পাদনযোগ্য করুন, তারপরে কেবল উপরের কমান্ডটি ব্যবহার করুন।

লিপিটি এখানে:

#!/bin/bash
_help="\n
Replace OLDSTRING with NEWSTRING recursively starting from current directory\n
multiedit [-n PATTERN] OLDSTRING NEWSTRING\n

[-n PATTERN] option limits to filenames matching PATTERN\n
Note: backslash escape special characters\n
Note: enclose STRINGS with spaces in double quotes\n
Example to limit the edit to python files:\n
multiedit -n \*.py \"OLD STRING\" NEWSTRING\n"

# ensure correct number of arguments, otherwise display help...
if [ $# -lt 2 ] || [ $# -gt 4 ]; then echo -e $_help ; exit ; fi
if [ $1 == "-n" ]; then  # if -n option is given:
        # replace OLDSTRING with NEWSTRING recursively in files matching PATTERN
        find ./ -type f -name "$2" -exec sed -i "s/$3/$4/g" {} \;
else
        # replace OLDSTRING with NEWSTRING recursively in all files
        find ./ -type f -exec sed -i "s/$1/$2/" {} \;
fi

1

যদি ফাইলটিতে ব্যাকস্ল্যাশ থাকে (সাধারণত পাথ থাকে) আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

sed -i -- 's,<path1>,<path2>,g' *

উদা:

sed -i -- 's,/foo/bar,/new/foo/bar,g' *.sh (in all shell scripts available)

1

আমার ব্যক্তিগত ইংলিশ নোড বজায় রাখতে, আমি একটি ইউটিলিটি স্ক্রিপ্ট লিখেছিলাম যা ডিরেক্টরিতে পুনরাবৃত্তির সাথে সমস্ত ফাইলের জন্য একাধিক জোড়া পুরানো / নতুন স্ট্রিং প্রতিস্থাপন করতে সহায়তা করে।

পুরানো / নতুন স্ট্রিংয়ের একাধিক জুড়ি একটি হ্যাশ মানচিত্রে পরিচালিত হয়।

দিরটি কমান্ড লাইন বা এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে সেট করা যেতে পারে, মানচিত্রটি স্ক্রিপ্টে হার্ড কোডড, তবে প্রয়োজনে কোনও ফাইল থেকে লোড করার জন্য কোডটি পরিবর্তন করতে পারেন।

কিছু নতুন বৈশিষ্ট্যের কারণে এটিতে 4.2 বাশ দরকার।

en_standardize.sh:

#! /bin/bash
# (need bash 4.2+,)
# 
# Standardize phonetic symbol of English.
# 
# format:
#   en_standardize.sh [<dir>]
# 
# params:
# * dir
#   target dir, optional,
#   if not specified then use environment variable "$node_dir_en",
#   if both not provided, then will not execute,
# * 
# 

paramCount=$#

# figure target dir,
if [ $paramCount -ge 1 ]; then # dir specified
    echo -e "dir specified (in command):\n\t$1\n"
    targetDir=$1
elif [[ -v node_dir_en ]]; then # environable set,
    echo -e "dir specified (in environment vairable):\n\t$node_dir_en\n"
    targetDir=$node_dir_en
else # environable not set,
    echo "dir not specified, won't execute"
    exit
fi

# check whether dir exists,
if [ -d $targetDir ]; then
    cd $targetDir
else
    echo -e "invalid dir location:\n\t$targetDir\n"
    exit
fi

# initial map,
declare -A itemMap
itemMap=( ["ɪ"]="i" ["ː"]=":" ["ɜ"]="ə" ["ɒ"]="ɔ" ["ʊ"]="u" ["ɛ"]="e")

# print item maps,
echo 'maps:'
for key in "${!itemMap[@]}"; do
    echo -e "\t$key\t->\t${itemMap[$key]}"
done
echo -e '\n'

# do replace,
for key in "${!itemMap[@]}"; do
    grep -rli "$key" * | xargs -i@ sed -i "s/$key/${itemMap[$key]}/g" @
done

echo -e "\nDone."
exit

1

Ack কমান্ড ব্যবহার করা এইভাবে অনেক দ্রুত হবে:

ack '25 Essex' -l | xargs sed -i 's/The\ fox \jump/abc 321/g'

এছাড়াও যদি অনুসন্ধানের ফলাফলটিতে আপনার একটি সাদা জায়গা থাকে। আপনার এড়াতে হবে


0

পাইথন উত্সগুলিতে একটি সাধারণ শেবাং ত্রুটি ঠিক করার জন্য আমি একটি উদাহরণ দিচ্ছি।

আপনি গ্রেপ / সেড পদ্ধতির চেষ্টা করতে পারেন। এখানে এমন একটি যা GNU সেডের সাথে কাজ করে এবং গিট রেপো ভাঙবে না:

$ grep -rli --exclude '*.git*' '#!/usr/bin/python' . | xargs -I {} \
gsed -i '' -e 's/#!\/usr\/bin\/python/#!\/usr\/bin\/env python/' {}

অথবা আপনি গ্রেপটাইল ব্যবহার করতে পারেন :)

$ greptile -x .py -l -i -g '#!/usr/bin/env python' -r '#!/usr/bin/python' .

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


0

আমি এটি অন্য পোস্ট থেকে পেয়েছি (কোনটি মনে করতে পারে না) এবং সবচেয়ে মার্জিত না হলেও এটি সহজ এবং একজন নবজাতক লিনাক্স ব্যবহারকারী আমাকে ঝামেলা দেয়নি

for i in *old_str* ; do mv -v "$i" "${i/\old_str/new_str}" ; done

আপনার যদি স্পেস বা অন্যান্য বিশেষ অক্ষর থাকে তবে একটি use

for i in *old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

সাব ডিরেক্টরি ডিরেক্টরিতে স্ট্রিং জন্য **

for i in *\*old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

0

নীচে কমান্ডটি প্রথমে ফাইলগুলি অনুসন্ধান করতে এবং ফাইলগুলি প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে:

find . | xargs grep 'search string' | sed 's/search string/new string/g'

উদাহরণ স্বরূপ

find . | xargs grep abc | sed 's/abc/xyz/g'

0

একটি সহজ স্ক্রিপ্ট ফাইল ব্যবহার করে একটি সহজ উপায় আছে:

   # sudo chmod +x /bin/replace_string_files_present_dir

জিডিট বা আপনার পছন্দের সম্পাদক এ ফাইলটি খুলুন, আমি এখানে জিডিট ব্যবহার করি।

   # sudo gedit /bin/replace_string_files_present_dir

তারপরে এডিটরটিতে ফাইলটিতে নিম্নলিখিতটি পেস্ট করুন

   #!/bin/bash
   replace "oldstring" "newstring" -- *
   replace "oldstring1" "newstring2" -- *
   #add as many lines of replace as there are your strings to be replaced for 
   #example here i have two sets of strings to replace which are oldstring and 
   #oldstring1 so I use two replace lines.

ফাইলটি সংরক্ষণ করুন, জিডিট বন্ধ করুন , তারপরে আপনার টার্মিনালটি থেকে প্রস্থান করুন বা কেবল এটি বন্ধ করুন এবং তারপরে আপনি যুক্ত হওয়া নতুন স্ক্রিপ্টটি লোড করতে সক্ষম হতে এটি শুরু করুন।

আপনি যে ডিরেক্টরিতে সম্পাদনা করতে চান সেখানে ডিরেক্টরিতে নেভিগেট করুন। তারপরে চালান:

  #replace_string_files_present_dir

প্রেস লিখুন এবং এই স্বয়ংক্রিয়ভাবে প্রতিস্থাপন করবে oldstring এবং oldstring1 সমস্ত ফাইল যে তাদের সঠিক থাকতে মধ্যে newstring এবং newstring1 যথাক্রমে।

এটি সমস্ত ডিরেক্টরি এবং ফাইলগুলিকে এড়িয়ে যাবে যাতে পুরানো স্ট্রিং থাকে না।

আপনার স্ট্রিং প্রতিস্থাপনের প্রয়োজন এমন ফাইলগুলির একাধিক ডিরেক্টরি থাকলে টাইপিংয়ের ক্লান্তিকর কাজটি দূর করতে সহায়তা করতে পারে। আপনাকে যা করতে হবে তা হ'ল সেই ডিরেক্টরিগুলির প্রত্যেকটিতে নেভিগেট করা, তারপরে চালনা করুন:

#replace_string_files_present_dir

আপনাকে যা করতে হবে তা হ'ল আপনি উপরে প্রতিস্থাপনের মতো প্রতিস্থাপনের সমস্ত স্ট্রিং অন্তর্ভুক্ত বা যুক্ত করেছেন তা নিশ্চিত করা:

replace "oldstring" "newstring" -- *

ফাইলের শেষে / বিন / রিপ্লেস_স্ট্রিং_ফাইলস_প্রিসেন্ট_ডির

একটি নতুন প্রতিস্থাপনের স্ট্রিং যুক্ত করতে কেবলমাত্র টার্মিনালে নিম্নলিখিতটি লিখে আমরা তৈরি করা স্ক্রিপ্টটি খুলুন:

sudo gedit /bin/replace_string_files_present_dir

আপনার সংযুক্ত স্ট্রিংগুলির সংখ্যার বিষয়ে চিন্তা করবেন না, যদি পুরানো স্ট্রিংটি পাওয়া না যায় তবে এগুলির কোনও প্রভাব থাকবে না ।


সাধারণত, লোকেরা যখন বাশে "কীভাবে $ {যাই হোক না কেন}" জিজ্ঞাসা করে, তখন তারা কোনও স্ক্রিপ্ট বা সিআই চাকরির নির্দেশিকায় (একটি .gitlab-ci.ymlবা একটি বলুন travis.yml) অন্তর্ভুক্ত করার জন্য একটি কমপ্যাক্ট সংস্করণ চাইবে । পরে এটি সম্পাদন করতে কোনও স্ক্রিপ্ট লেখার সাথে সাথে প্রতিটি ঘুরে দাঁড়ানো একটি বিরোধী প্যাটার্ন, কারণ আপনাকে তখন স্ক্রিপ্ট তৈরির স্ক্রিপ্ট করতে হবে (এবং আমি বেশিরভাগ সময়ই অগোছালো হয়ে যাই)
zar3bski

-4

"" থেকে "" থেকে "প্রতিস্থাপন করুন -` সন্ধান / পাথ / থেকে / ফোল্ডার-টাইপ f` `

(প্রতিস্থাপন - মাইএসকিউএল ডেটাবেস সিস্টেমের একটি স্ট্রিং-রিপ্লেসমেন্ট ইউটিলিটি)

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