পুনরাবৃত্ত অনুসন্ধান এবং ম্যাক এবং লিনাক্সের পাঠ্য ফাইলগুলিতে প্রতিস্থাপন করুন


127

লিনাক্স শেল-এ, নিম্নলিখিত কমান্ডটি 'এই' এর সমস্ত দৃষ্টান্তগুলি পুনরাবৃত্তভাবে অনুসন্ধান এবং প্রতিস্থাপন করবে (আমার সামনে লিনাক্স শেল নেই, তবে এটি করা উচিত)।

find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

ওএসএক্সে অনুরূপ কমান্ড কেমন হবে?


apple.stackexchange.comএটি সম্ভবত লিনাক্স বা সমস্ত ডেভসের জন্য যথেষ্ট জেনারিক না হওয়ায় সরে যাওয়া উচিত ।
অ্যালিকেলিন-কিলাকা

উত্তর:


246

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

https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

সেড -iব্যাকআপগুলির জন্য এক্সটেনশন হিসাবে যুক্তির পরে নেয় । একটি খালি স্ট্রিং সরবরাহ করুন (-i ''কোনও ব্যাকআপ না দেওয়ার জন্য করুন।

নিম্নলিখিতগুলি করা উচিত:

LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +

-type fশুধু ভাল অনুশীলন; সেড অভিযোগ করবে যদি আপনি এটি কোনও ডিরেক্টরি বা আরও কিছু দেন। -execউপর অগ্রাধিকার দেওয়া হয় xargs; আপনার -print0কোনও কিছুই বা বিরক্ত করার দরকার নেই। {} +শেষ মানে যে findপরিবর্তে নামক কমান্ডের এক উদাহরণ হিসেবে বলা যায় আর্গুমেন্ট হিসাবে সমস্ত ফলাফল যোগ হবে, প্রতিটি ফলাফলের জন্য এটি পুনরায় চলছে। (ওএস দ্বারা অনুমোদিত সর্বাধিক সংখ্যক কমান্ড-লাইন আর্গুমেন্ট লঙ্ঘন করা হলে একটি ব্যতিক্রম হয়; সেক্ষেত্রে findএকাধিক উদাহরণ চলবে))


2
আমার এই "বিকল্প" এর বিকল্পটিতে একটি ফরোয়ার্ড স্ল্যাশ রয়েছে (লোকালহোস্ট / সাইট) - আমি একটি এইচটিএমএল ফাইলটিতে কোনও ইউআরএলের অংশগুলি প্রতিস্থাপন করছি .... আমি কীভাবে এই বিকল্পটি করব। আমি ডাবল-কোট দেওয়ার চেষ্টা করেছি, তবে এটি ব্যর্থ হয়।
টিমোথি টি।

6
SED সিনট্যাক্স প্রায় ব্যবহার করতে পারবেন কোন স্ল্যাশ স্থানে চরিত্র, আপনি ব্যবহার করতে পারে যেমন %অক্ষর: sed "s%localhost/site%blah/blah%"। আরেকটি বিকল্প বিভাজক ব্যাকস্ল্যাশ-অব্যাহতি হল: sed "s/localhost\/site/blah\/blah/"
তেলানুব

ধন্যবাদ আপনি আমাকে চেষ্টা করতে দিন। তবে আমি স্ল্যাশ পৃথক করার জন্য {using ব্যবহার করার চেষ্টা করেছি এবং আমি এখনও একটি ত্রুটি পেয়েছি ...
টিমোথি টি।

16
অন্য কারও illegal byte sequenceত্রুটি হচ্ছে? যদি তাই হয়, চেষ্টা করুন LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +:, এটি আমার পক্ষে কাজ করেছিল।
কোল্ড টুনা

10
এটি প্রতি ফাইলের /gজন্য কেবল একটি ocurreny প্রতিস্থাপন করা হবে, একাধিক অর্থের জন্য যেমনLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
জামেসের

152

ম্যাকের জন্য আরও অনুরূপ পন্থাটি হ'ল:

find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"

10
আমি আশা করি প্রতিবার এটিতে ফিরে এসে এটি ব্যবহার করার সময় আমি এটিকে উজ্জীবিত করতে পারি। এখনই এটি +15 এ হবে, সহজ।
Droogans

কিছু কারণে, এটি আমার পক্ষে কাজ করে না। এটা কিছুই করে না। আমি ফর্ম 360 ফোল্ডারের অভ্যন্তরে আছি এবং আইএম নীচের কমান্ডটি চালিয়ে আইএমএমে ফর্ম 360 নামটি সহ সমস্ত স্ট্রিং দৃষ্টান্ত পরিবর্তন করার চেষ্টা করছি:find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
আন্দ্রেস রামোস

2
আমার জন্য, এটি সঠিক উত্তর হওয়া উচিত। এটিই আমার পক্ষে কাজ করেছে।
নাসকোলেদিবী

1
-প্রিন্ট 0 | xargs -0 আমার ম্যাকের সাথে কাজ করে না যখন ফাইলের নাম স্থান দেয়।
ব্যবহারকারী2807219

1
সেড:।: ইন-প্লেস এডিটিং কেবল নিয়মিত ফাইলের জন্যই কাজ করে
কোডলেপার

14

বিকল্প সমাধান হিসাবে, আমি ম্যাক ওএসএক্স 10.7.5 এ এটি ব্যবহার করছি

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

ক্রেডিট এতে যায়: টড সিজারের উত্তর


এই এক ভাল কাজ করে! অন্যান্য স্ক্রিপ্টগুলি ওএসএক্সে কিছু ক্ষেত্রে লাইনের একটি অতিরিক্ত প্রান্ত যুক্ত করে! অনেক ধন্যবাদ!
সেবাস্তিয়ান ফিলিওন

14

ম্যাক ওএসএক্স 10.11.5 এ এটি সূক্ষ্মভাবে কাজ করে:

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

xargs -I @ sed -i '' s / old-word / new-word / g '@ আমার জন্য কাজ করেছে আরও অনেকগুলি অ-কাজের পরামর্শ দেওয়ার পরে। ধন্যবাদ!
ডাবিবি

13

ওএসএক্সে উপরের কোনওটিই কাজ করে না।

নিম্নলিখিতগুলি করুন:

perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt

1
কীভাবে '/' কে স্কিপ করবেন যদি SEARCH_FOR এবং REPLACE_WITH পাথ থাকে?
rraallvv

একটি ভিন্ন সীমানা ব্যবহার করুন। আপনি যদি পাথ ব্যবহার করেন তবে একটি কোলন বা পাইপ কাজ করবে। উদাহরণস্বরূপ 'গুলি | অনুসন্ধান | প্রতিস্থাপন | ছ'। আমাদের ব্যবহার ধনুর্বন্ধনী, যেমন '{অনুসন্ধান} P প্রতিস্থাপন}'।
dannysauer

1
ডিটো প্রশ্ন, ম্যাকের জন্য এটি চেষ্টা করে না - তবে মনে হচ্ছে এটির একটি ত্রুটি ঘটেছে? উদাহরণস্বরূপ, আমার পথটি ফাইল হিসাবে ব্যাখ্যা করা যায়? -বাশ: লোকালহোস্ট / নোহোস্ট: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
টিমোথি টি।

এটি গভীরভাবে ফোল্ডারগুলির মাধ্যমে পুনরাবৃত্তি করে না। মাত্র একটি স্তর।
সের্গে রোমানভ

এই কমান্ড সম্পর্কে আরও তথ্যের জন্য এই পড়া lifehacker.com/5810026/...
kuzdu

7

এমন একটি সংস্করণ যা লিনাক্স এবং ম্যাক ওএস এক্স উভয়ে কাজ করে (এতে -eস্যুইচ যুক্ত করে sed):

export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'

আমাকে এই উত্তরটি থেকে রফতানি করতে হয়েছিল + গৃহীত উত্তর থেকে লাইনটি (আমি ব্যাকআপ ফাইলগুলি উত্পন্ন করতে চাইনি)
ল্যান্স

2
'অবৈধ বাইট সিকোয়েন্স' ত্রুটিটি মোকাবেলা করতে, কমান্ডটি চালানোর আগে export LC_CTYPE=C && export LANG=C
লকএল

আপনি যদি গিট ব্যবহার করছেন তবে আমি যেমন করেছিলাম তেমন '*। ফাইলটাইপ' এর পরিবর্তে '*' দিয়ে এটিকে চালাবেন না। অথবা আপনি আপনার সমস্ত অপ্রকাশিত কাজকে বিদায় জানাতে পারেন।
সের্গেই

1
সিড কমান্ডের ম্যাক সংস্করণে -i এর পরে একটি '' প্রয়োজন, সুতরাং এই উত্তরটি ভুল
জি হাক্সলি

2

আমি যখনই এই কমান্ডটি টাইপ করি তখনই আমি সর্বদা এটিটিকে হোস আপ করে দেখি, বা কোনও পতাকা ভুলে যাই। আমি তেলানুবের উত্তরের ভিত্তিতে গিথুব-এ একটি গিস্ট তৈরি করেছি যা বর্তমান ডিরেক্টরি থেকে বিশ্বব্যাপী খুঁজে পেতে পারে। এটি ম্যাক ওএসএক্স নির্দিষ্ট।

https://gist.github.com/nateflink/9056302

এটি দুর্দান্ত কারণ এখন আমি টার্মিনালটি খোলার পরে কপি করুন:

কার্ল-এস https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "Find-a-url.com" "প্রতিস্থাপন-a-url.com"

আপনি কিছু অদ্ভুত বাইট সিকোয়েন্স ত্রুটি পেতে পারেন, তাই এখানে পুরো কোডটি রয়েছে:

#!/bin/bash
#By Nate Flink

#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"

if [ -z "$1" ] || [ -z "$2" ]; then
  echo "Usage: ./$0 [find string] [replace string]"
  exit 1
fi

FIND=$1
REPLACE=$2

#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;

#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0

2

এটি আমার কর্মক্ষম। ম্যাক ওএস এক্স 10.10.4 এ

grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'

উপরে বেশী ব্যবহার খোঁজ ফাইল অনুসন্ধান পাঠ্য (ফাইল শেষে একটি নতুন লাইন যোগ), যা বাগাড়ম্বরপূর্ণ হয় থাকে না পরিবর্তন করতে হবে।


2

আপনি যদি একটি zsh টার্মিনাল ব্যবহার করে থাকেন তবে আপনি ওয়াইল্ডকার্ড যাদুটি ব্যবহার করতে পারবেন:

sed -i "" "s/search/high-replace/g" *.txt


1

আমি এই ফর্ম্যাটটি ব্যবহার করেছিলাম - তবে ... আমি পেয়েছি যে আমাকে খুব অদ্ভুত বলে মনে হয়েছে এমন প্রতিটি প্রকৃতপক্ষে পরিবর্তন আনতে এটি পেতে আমাকে তিন বা তার বেশি বার চালাতে হয়েছিল। এটি একবার চালানোতে প্রতিটি ফাইলে কিছু পরিবর্তন হবে তবে সমস্ত নয়। দু'-চারবার ঠিক একই স্ট্রিং চালানো সমস্ত দৃষ্টান্ত ধরে ফেলবে।

find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +

আপনার একাধিকবার এই কমান্ডটি চালানোর দরকার ছিল খ / সি আপনার সেড রেইগেক্সের gশেষে একটি প্রয়োজন , অন্যথায় এটি কেবল thistextএকটি লাইনের প্রথম উপস্থিতিটি প্রতিস্থাপন করে । সুতরাং আপনার রেজেক্সটি হওয়া উচিতs/thistext/newtext/g
লেস নাইটিংল

0

https://bitbucket.org/masonicboom/serp হ'ল ইউটিলিটি (অর্থাত্ ক্রস-প্ল্যাটফর্ম), যা ওএসএক্স-এ পরীক্ষিত হয়, যা প্রদত্ত ডিরেক্টরিতে ফাইলগুলিতে পাঠ্যের জন্য পুনরাবৃত্ত অনুসন্ধান এবং প্রতিস্থাপন করে এবং প্রতিটি প্রতিস্থাপনের বিষয়টি নিশ্চিত করে। এটি নতুন, তাই বগিও হতে পারে।

ব্যবহারের মতো দেখাচ্ছে:

$ ls test
a  d  d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"                         
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye


-3

ওএসএক্স-এ কমান্ডটি ঠিক একইরকম হওয়া উচিত যেমন এটি ইউনিক্সের মতো সুন্দর ইউআই এর অধীনে।


আমি অনেক ভেবেছি, কিন্তু না। সেড খাওয়ানোর সময় এটি ফাইলের সামনে একটি ./ রাখে, সুতরাং সেড 'অবৈধ কমান্ড কোড' অভিযোগ করে। সম্ভবত আমি কেবল ক্লান্ত ;-)
জ্যাক

@ জ্যাকোবাসআর, দয়া করে আপনার ওএসএক্স টার্মিনালটি থেকে কেটে পেস্ট করুন - আপনাকে অবশ্যই কিছুটা আলাদা enteringোকাতে হবে।
গ্লেন জ্যাকম্যান

3
যদি আপনি চান পারে -print0যোগ করা findপতাকা এবং -0করতে xargsপতাকা।
jmtd

আপনি কেবল এবং xargs এর -exec sed -i s/this/that/g {} \+পরিবর্তে-print
মারিয়ান

@ জ্যাকোবাসআর - এটি 'নেতৃস্থানীয়' ./ 'পথের নাম থাকলেও এটি কাজ করে। যাইহোক, যদি ফাইলনামে কোনও স্থান থাকে, "./jacobus। R.txt" বলুন, xargsস্থান-সীমাবদ্ধ "./jacobus" কে ফাইল হিসাবে পাস করার জন্য sedএবং তারপরে "R.txt" দিয়ে দেখতে পাবেন might যার কোনটিরই অস্তিত্ব নেই।
ব্রেট হ্যালে

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