ফাইলটি সন্ধান করুন এবং প্রতিস্থাপন করুন এবং ওভাররাইট ফাইলটি কাজ করে না, এটি ফাইলটি খালি করে


604

আমি কমান্ড লাইনের মাধ্যমে একটি HTML ফাইলের সন্ধান এবং প্রতিস্থাপন করতে চাই।

আমার আদেশটি এরকম কিছু দেখাচ্ছে:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html

আমি যখন এটি চালনা করি এবং পরে ফাইলটি দেখি, এটি খালি। এটি আমার ফাইলের সামগ্রী মুছে ফেলেছে।

আমি আবার ফাইলটি পুনরুদ্ধার করার পরে এটি চালাচ্ছি:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

stdoutফাইলের বিষয়বস্তু, এবং এটি এবং প্রতিস্থাপন মৃত্যুদন্ড কার্যকর করা হয়েছে।

ইহা কি জন্য ঘটিতেছে?


13
পার্ল বিকল্প:perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html
গজরগজি তাশকভস্কি

অনেক সংশ্লিষ্ট sedকমান্ড একটি স্ট্রিং খুঁজে পেতে এবং পুরো লাইন প্রতিস্থাপন: stackoverflow.com/questions/11245144/...
cregox

উত্তর:


917

যখন শেল উদ্ধার > index.htmlকমান্ড লাইনে এটা ফাইল খোলে index.htmlজন্য লেখা , তার সমস্ত পূর্ববর্তী বিষয়বস্তু বন্ধ সম্মার্জনী।

এটি ঠিক করার জন্য আপনাকে পরিবর্তনগুলি ইনলাইন করার জন্য -iবিকল্পটি পাস করতে sedহবে এবং স্থানে পরিবর্তনগুলি করার আগে মূল ফাইলটির একটি ব্যাকআপ তৈরি করতে হবে:

sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

.Bak ব্যতীত কমান্ডটি কিছু প্ল্যাটফর্মে ব্যর্থ হবে, যেমন ম্যাক ওএসএক্স।


20
truncates the fileপরিবর্তে বলা opens the fileসম্ভবত এটি আরও পরিষ্কার করে তোলে।
মাইকেল

12
কমপক্ষে আমার ম্যাকের ক্ষেত্রে, প্রথম পরামর্শটি কার্যকর হয় না ... আপনি যদি কোনও ফাইলের জায়গায় স্থান পরিবর্তন করেন, আপনাকে একটি এক্সটেনশন নির্দিষ্ট করতে হবে। আপনি, কমপক্ষে, শূন্য-দৈর্ঘ্যের এক্সটেনশনে পাস করতে পারেন যদিও: সেড-আই '/ সিআরএল_পিএলসিএল / STRING_TO_REPLACE_IT / জি
সূচক html

5
ভেরিয়েবলের জন্য -i.bak 's /' $ অনুসন্ধান '/' $ প্রতিস্থাপন '/ g' সূচি html
ফাতেমা জোহরা

33
ওএসএক্সে, -i এর প্যারামিটার হিসাবে একটি ফাঁকা স্ট্রিং '' ব্যবহার করুন, যেমন:sed -i '' 's/blah/xx/g'
পিয়ের হিউস্টন

4
তবে তোমার .bakপরে কি sed -i?
প্যাট্রিজিও বার্তোনি

210

বিকল্প, দরকারী, প্যাটার্নটি হ'ল:

sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html

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

বেশিরভাগ বীজের -iবিকল্প রয়েছে, তবে তাদের সবকটিই নয়; পিক্সিক সেড যা হয় না। আপনি যদি বহনযোগ্যতার জন্য লক্ষ্য রাখছেন তবে এটি সর্বোত্তম এড়ানো।


9
চার্জযুক্ত কোনও ব্যাকআপ ফাইলের জন্য +1 এবং সম্পাদনা ব্যর্থ হলে ইনপুট ফাইলটি ক্লোবার্বিং নয়। ম্যাকের ত্রুটিহীনভাবে কাজ করেছেন।
মাইক গ্রেস

আমার জন্য নিখুঁতভাবে কাজ করেছেন। ধন্যবাদ! (একটি ম্যাকের উপর)
আগ্রহী

1
এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে যেখানে উবুন্টু সার্ভারে 14.04 সেড -i ফাইলটি শূন্য করে রেখেছিল।
ক্রিস গিডিংস

2
চূড়ান্তভাবে সামান্য বর্ধন:... && mv index.html{.tmp,}
এডওয়ার্ডারসন

5
@ অ্যাডওয়ার্ডারসন আসলে, আমি এটি টাইপ করতে পারলে সম্ভবত এটিই ব্যবহার করতাম - আমি সম্মত হলাম এটি আরও সুন্দর - তবে sh(যদি আমি সঠিকভাবে স্মরণ করি) এর প্রসারটি নেই {...}। কোনও মেকফিলের shপরিবর্তে আপনি সম্ভবত এটি ব্যবহার bashকরছেন, সুতরাং আপনি যদি বহনযোগ্যতার জন্য লক্ষ্য রাখছেন (বা পিক্সেসনেস) তবে আপনাকে সেই নির্মাণ এড়াতে হবে।
নরম্যান গ্রে

95
sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' index.html

এটি ফাইলের সূচক html এ বিশ্বব্যাপী স্থান পরিবর্তন করতে পারে। স্ট্রিংয়ের উদ্ধৃতি কোয়েরি এবং রিপ্লেসমেন্টে শ্বেতস্পেসের সমস্যাগুলি প্রতিরোধ করে।


57

সেড -i বিকল্পটি ব্যবহার করুন, যেমন

sed -i bak -e s/STRING_TO_REPLACE/REPLACE_WITH/g index.html

এটার মানে কি? সেড: -i
স্টিডিনের

2
আপনার প্যাটার্নটি চারপাশে রাখার কথা মনে রাখবেন যদি এতে সাদা অংশ থাকে -'s/STRING_TO_REPLACE/REPLACE_WITH/g'
ডগ থম্পসন

@sheetal: -iইন-জায়গা সঞ্চালিত সম্পাদনা ফাইল , তাই এটি দিয়ে একত্রিত করতে অর্থে দেখা যায় না stdin ইনপুট।
mklement0

এটি ম্যাকোস-এ কাজ করতে পারে তবে এটি আমার জন্য আর্চ লিনাক্সে নেই।
xdevs23

-ই ছাড়া, গৃহীত উত্তরটি ম্যাকওএস, কাতালিনাতে কাজ করে না। এর সাথে এটি কাজ করে।
cwhiii

18

একাধিক ফাইল (এবং প্রত্যেকটির ব্যাকআপ * .বাক হিসাবে সংরক্ষণ করা) পরিবর্তন করতে:

perl -p -i -e "s/\|/x/g" *  

ডিরেক্টরির মধ্যে সব ফাইল গ্রহণ করা এবং প্রতিস্থাপন করবে |সঙ্গে x এই একটি "পার্ল পাই" বলা হয় (সহজ একটি পাই হিসাবে)


1
কেবলমাত্র ট্যাগগুলি নয়, সমস্যার বিবৃতি দেখতে ইচ্ছুক কাউকে দেখে ভাল। ওপি sedপ্রয়োজনীয়তা হিসাবে নির্দিষ্ট করে নি , কেবল এটি ইতিমধ্যে চেষ্টা করা সরঞ্জাম হিসাবে ব্যবহার করেছে।
ব্যবহারকারী 7412956

14

আপনার -iজায়গাটিতে সম্পাদনা করার বিকল্পটি ব্যবহার করার চেষ্টা করা উচিত ।


6
sed -i.bak "s#https.*\.com#$pub_url#g" MyHTMLFile.html

আপনার যদি যোগ করার কোনও লিঙ্ক থাকে তবে এটি ব্যবহার করে দেখুন। উপরের মতো ইউআরএল অনুসন্ধান করুন (https থেকে শুরু হয়ে এখানে ডট কম দিয়ে শেষ করুন) এবং এটি URL স্ট্রিংয়ের সাথে প্রতিস্থাপন করুন। আমি $pub_urlএখানে একটি ভেরিয়েবল ব্যবহার করেছি । sএখানে অনুসন্ধান এবং এর gঅর্থ বিশ্বব্যাপী প্রতিস্থাপন।

এটি কাজ করে!


6

সতর্কতা: এটি একটি বিপজ্জনক পদ্ধতি! এটি লিনাক্সে এবং / বাফারগুলির নির্দিষ্ট বিকল্পগুলির সাথে আই / ও বাফারগুলিকে আপত্তিজনক ব্যবহার করে এটি ছোট ফাইলগুলিতে কাজ করে। এটি একটি আকর্ষণীয় কৌতূহল। তবে এটি বাস্তব পরিস্থিতির জন্য ব্যবহার করবেন না!

-iবিকল্পের পাশাপাশি sed আপনি teeইউটিলিটিটি ব্যবহার করতে পারেন ।

থেকে man:

টি - স্ট্যান্ডার্ড ইনপুট থেকে পড়ুন এবং স্ট্যান্ডার্ড আউটপুট এবং ফাইলগুলিতে লিখুন

সুতরাং, সমাধানটি হ'ল:

sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html

- teeপাইপলাইনটি বাফার হয়েছে কিনা তা নিশ্চিত করার জন্য এখানে পুনরাবৃত্তি করা হয়েছে । তারপরে পাইপলাইনে থাকা সমস্ত কমান্ডগুলি কাজ করার জন্য কিছু ইনপুট না পাওয়া পর্যন্ত অবরুদ্ধ করা হবে। পাইপলাইনের প্রতিটি কমান্ড শুরু হয় যখন আপস্ট্রিম কমান্ডগুলি কমান্ডের ইনপুটটিতে 1 টি বাফার (আকারটি কোথাও সংজ্ঞায়িত ) লেখা থাকে। সুতরাং শেষ কমান্ডtee index.html , যা লেখার জন্য ফাইলটি খোলায় এবং তাই এটি খালি করে, আপস্ট্রিম পাইপলাইন শেষ হওয়ার পরে চলে এবং পাইপলাইনের মধ্যে আউটপুট বাফারে থাকে।

সম্ভবত নিম্নলিখিতটি কাজ করবে না:

sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html

- এটি কোনও বাধা ছাড়াই একই সাথে পাইপলাইনের উভয় কমান্ড চালাবে। (পাইপলাইন ব্লক ছাড়া বাফার দ্বারা বাফার পরিবর্তে লাইন দ্বারা বাইট লাইন পাস করা উচিত। যখন আপনি চালাতে হিসাবে একই cat | sed s/bar/GGG/ব্লক এটি আরো ইন্টারেক্টিভ এবং সাধারণত 2 কম্যান্ডের পাইপলাইনগুলি বাফারিং এবং ব্লক করা ছাড়াই চালানো ছাড়া।। আর পাইপলাইনগুলি বাফার করা হয়।) tee index.htmlইচ্ছা লেখার জন্য ফাইলটি খুলুন এবং এটি খালি করা হবে। তবে আপনি যদি সর্বদা বাফারিং চালু করেন তবে দ্বিতীয় সংস্করণটিও কার্যকর হবে।


3
টি-র আউটপুট ফাইলটি তত্ক্ষণাত খোলা হয় যার ফলে পুরো কমান্ডের জন্য খালি সূচি html হয়।
sjngm

3
এটি পাইপলাইন বাফার (যা সাধারণত K৪ কেবি) এর চেয়ে বড় আকারের কোনও ইনপুট ফাইলকে দূষিত করবে । (@ এসজেএনজিএম: ফাইলটি তত্ক্ষণাত্ কাটা হয়নি) তবে মূল বক্তব্যটি এটি হ'ল >এটি একটি ভাঙ্গা সমাধান যা ডেটা হ্রাস পেতে পারে।
mklement0

4

কমান্ড নিয়ে সমস্যা

sed 'code' file > file

যে fileশেল দ্বারা ছেঁটে ফেলা আসলে sed এটি প্রক্রিয়া পায় সামনে করা হয়। ফলস্বরূপ, আপনি একটি খালি ফাইল পাবেন।

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

tmp=$(sed 'code' file); echo -n "$tmp" > file

আরও ভাল, যেহেতু কিছু শেল (যেমন ড্যাশ) এর মতো প্রক্রিয়াজাত হতে পারে তার printfপরিবর্তে ব্যবহার করুন :echoecho\\\

tmp=$(sed 'code' file); printf "%s" "$tmp" > file

1
লিঙ্ক সংরক্ষণের জন্য +1। এটি একটি অস্থায়ী ফাইলের সাথেও কাজ করে:sed 'code' file > file.tmp; cat file.tmp > file; rm file.tmp
দশোহক্স

3

এবং edউত্তর:

printf "%s\n" '1,$s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' w q | ed index.html

কোডডটিক্ট জবাব দিয়েছিল সেটির পুনরাবৃত্তি করতে , শেলটি "ইনপুট.ইচটিএমএল" ফাইলটি নিশ্চিহ্ন করে প্রথমে পুনর্নির্দেশটি পরিচালনা করে এবং তারপরে শেলটি "সেড " কমান্ডটি খালি ফাইলটি পাস করার অনুরোধ করে।


2
দ্রুত প্রশ্ন, কেন লোকেরা উত্তরগুলির ed"সংস্করণ" sedদেয়? এটি দ্রুত সঞ্চালন না?
ক্রেগোক্স

6
কিছু স্থানে সম্পাদনা করার জন্য sedপ্রয়োগ -iকরে না । edসর্বব্যাপী এবং এটি আপনাকে আপনার সম্পাদনাগুলি মূল ফাইলে সংরক্ষণ করতে দেয়। এছাড়াও আপনার কিটটিতে প্রচুর সরঞ্জাম থাকা সর্বদা ভাল।
গ্লেন জ্যাকম্যান

ঠিক আছে শান্ত হও. সুতরাং, কর্মক্ষমতা অনুসারে, তারা আমার মতামত একই। ধন্যবাদ!
ক্রেগোক্স

2

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

ex -sc '%s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g|x' index.html
  1. % সমস্ত লাইন নির্বাচন করুন

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


0

আমি বিকল্পটি সন্ধান করছিলাম যেখানে আমি লাইন রেঞ্জটি সংজ্ঞায়িত করতে পারি এবং উত্তরটি খুঁজে পেয়েছি। উদাহরণস্বরূপ আমি হোস্ট 1টিকে হোস্ট 2 থেকে 36-57 লাইন থেকে পরিবর্তন করতে চাই।

sed '36,57 s/host1/host2/g' myfile.txt > myfile1.txt

চরিত্রের ক্ষেত্রে উপেক্ষা করার জন্য আপনি জিআই বিকল্পটিও ব্যবহার করতে পারেন।

sed '30,40 s/version/story/gi' myfile.txt > myfile1.txt

0

উপরের সঠিক উত্তরের প্রতি যথাযোগ্য সম্মানের সাথে, "ড্রাই ড্রাই" স্ক্রিপ্টগুলি সর্বদা এটির জন্য একটি ভাল ধারণা, যাতে আপনি নিজের ফাইলকে কলুষিত না করেন এবং আবার শুরু থেকে শুরু করতে পারেন।

আপনার স্ক্রিপ্টটি ফাইলটিতে লেখার পরিবর্তে কমান্ড লাইনে আউটপুট ছড়িয়ে দেওয়ার জন্য পান, উদাহরণস্বরূপ:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

অথবা

less index.html | sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g 

এইভাবে আপনি নিজের ফাইলটি কেটে না পেয়ে কমান্ডের আউটপুট দেখতে এবং পরীক্ষা করতে পারবেন।

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