সেড ইন-প্লেস পতাকা যা ম্যাক (বিএসডি) এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করে


237

সেখানে একজন আবাহন হয় sedএই স্থানে সম্পাদনা করণীয় ব্যাকআপ ছাড়া উভয় Linux এবং Mac এ কাজ করে? sedওএস এক্সের সাথে বিএসডি পাঠানো দরকার মনে sed -i '' …হলেও জিএনইউ sedলিনাক্স ডিস্ট্রিবিউশনগুলি সাধারণত উদ্ধৃতিগুলি খালি ইনপুট ফাইলের নাম (ব্যাকআপ এক্সটেনশানের sed -i …পরিবর্তে ) হিসাবে ব্যাখ্যা করে আসে এবং তার পরিবর্তে প্রয়োজন হয়।

কোনও কমান্ড লাইন সিনট্যাক্স যা উভয় স্বাদে কাজ করে, তাই আমি উভয় সিস্টেমে একই স্ক্রিপ্টটি ব্যবহার করতে পারি?


পার্ল কি বিকল্প নয়? আবশ্যক আপনি sed ব্যবহার করবেন?
নওফাল ইব্রাহিম

সম্ভবত জিএনইউ সংস্করণ ইনস্টল করুন এবং এটি ব্যবহার করুন! topbug.net/blog/2013/04/14/… ? আমি প্রথমে চেষ্টা করব। তারপরে আবার, এই ধরণের খুব সফল হয়।
দিমিত্রি মিনকভস্কি

2
@dimadima: এই প্রশ্নটি ব্রাউজ করা অন্য কিছু লোকের কাছে আকর্ষণীয় হতে পারে যাদের ওএস এক্স মেশিনে ব্যক্তিগত স্ক্রিপ্ট রয়েছে। আমার ক্ষেত্রে, যদিও এটি একটি ওপেন সোর্স প্রকল্পের বিল্ড সিস্টেমের জন্য আমার প্রয়োজন ছিল, যেখানে আপনার ব্যবহারকারীকে প্রথমে GNU সেড ইনস্টল করতে বললে এই অনুশীলনের আসল উদ্দেশ্যটি হারাতে পারে ("সমস্ত জায়গায় কাজ করে" ফ্যাশনে কয়েকটি ফাইলের প্যাচ) ।
dnadlinger

@ ক্লিকভারবোট হ্যাঁ, তা বোঝায় sense আমি প্রথমে উত্তর হিসাবে মন্তব্যটি যুক্ত করেছি এবং তারপরে এটি মুছে ফেলেছিলাম, বুঝতে পেরে এটি আপনার প্রশ্নের উত্তর নয় :)।
দিমিত্রি মিনকভস্কি

1
ক্রস রেফারেন্স: সেড -i (ইনস-প্লেস এডিটিং) দিয়ে বহনযোগ্যতা কীভাবে অর্জন করবেন? ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জে।
এমভিজি

উত্তর:


212

আপনি যদি সত্যিই কেবল sed -i'সহজ' উপায়টি ব্যবহার করতে চান তবে নীচেরগুলি জিএনইউ এবং বিএসডি / ম্যাক উভয় ক্ষেত্রেই কাজ করে sed:

sed -i.bak 's/foo/bar/' filename

স্থান এবং বিন্দু অভাব নোট করুন।

প্রমাণ:

# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

অবশ্যই আপনি কেবল .bakফাইলগুলি মুছতে পারেন ।


2
এই পথেই যেতে হবে। কয়েকটি অক্ষর যুক্ত করুন এবং এটি বহনযোগ্য। ব্যাকআপ ফাইলটি মুছে ফেলা তুচ্ছ (আপনার কাছে ইতিমধ্যে ফাইলের নাম থাকা অবস্থায় sed)
slezica

এটি ম্যাকের জন্য কাজ করেছিল তবে উবুন্টু 16.04 এ এটি মূল ফাইলটি 0 বাইটে ওভাররাইট করে এবং 0 বাইটের সাহায্যে .bak ফাইলটি তৈরি করে?
বাড়ি 9

1
লক্ষণীয়, ম্যাকোস সিয়েরায় (এবং সম্ভবত এর আগে, আমার কাছে কোনও মেশিন হ্যান্ডি নেই), যখন অনুরোধ করা হয় তখন অবস্থানিক যুক্তি sedগ্রহণ করে না - এটি অন্য পতাকা সহ সরবরাহ করা আবশ্যক ,। সুতরাং, কমান্ডটি হয়ে যায়:command-i-esed -i.bak -e 's/foo/bar/' filename
এলিওটিটিসিবিএল

5
এটি ব্যাকআপ তৈরি করে, অন্যদিকে ওপি বিশেষত ইন-প্লেস সম্পাদনা করতে বলে।
মার্ক-আন্দ্রে লাফোর্টুন

8
সুতরাং সম্পূর্ণ সমাধানটি হ'ল:sed -i.bak 's/foo/bar/' file && rm file.bak
জোয়েটউইডল

111

এটি জিএনইউ সিডের সাথে কাজ করে তবে ওএস এক্সে নয়:

sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file

এটি ওএস এক্সে কাজ করে, তবে জিএনইউ সিডের সাথে নয়:

sed -i '' -e 's/foo/bar/' target.file

ওএস এক্সে আপনি

  • sed -i -eব্যাকআপ ফাইলটির এক্সটেনশান সেট হয়ে যাওয়ার পরে ব্যবহার করতে পারবেন না-e
  • sed -i'' -eএকই কারণে ব্যবহার করতে পারবেন না — এর মধ্যে -iএবং এর মধ্যে একটি স্থান প্রয়োজন ''

1
@ আলেকজান্ডারমিলস সেডকে জানায় যে পরবর্তী যুক্তি হ'ল কমান্ড - এখানেও এড়ানো যেতে পারে।
বেনিয়ামিন ডাব্লু।

4
নোট করুন -iএবং -i''শেল পার্সিংয়ের সময় অভিন্ন; এই দুটি প্রথম অনুরোধে আলাদাভাবে আচরণ sed করতে পারে না , কারণ এটি ঠিক একই যুক্তি পায়।
wchargin

44

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

brew install gnu-sed --with-default-names

তারপরে আপনার বিএসডি সেডটি জিএনইউ সেড দ্বারা প্রতিস্থাপন করা হবে।

বিকল্পভাবে, আপনি ডিফল্ট-নাম ছাড়াই ইনস্টল করতে পারেন, তবে তারপরে:

  • PATHইনস্টল করার পরে নির্দেশিত অনুযায়ী পরিবর্তন করুনgnu-sed
  • আপনার সিস্টেমের উপর নির্ভর করে gsedবা তার sedউপর নির্ভর করে আপনার স্ক্রিপ্টগুলি পরীক্ষা করে দেখুন

4
--with-default-namesছিল homebrew কোর থেকে সরানো , আরও তথ্য এই উত্তর। ইনস্টল gnu-sedএখন ইনস্টলেশন সংক্রান্ত নির্দেশাবলী উল্লেখ যে আপনার যোগ করতে হবে gnubinআপনার টু PATH:PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
pgericson

18

নওফাল ইব্রাহিম যেমন জিজ্ঞাসা করেছেন, আপনি পার্ল ব্যবহার করতে পারবেন না কেন? যে কোনও ম্যাকের পার্ল থাকবে, এবং খুব কম লিনাক্স বা বিএসডি বিতরণ রয়েছে যা বেস সিস্টেমে পার্লের কিছু সংস্করণ অন্তর্ভুক্ত করে না। পার্লের প্রকৃত একমাত্র পরিবেশের মধ্যে একটি হ'ল ব্যাসিবক্স (যা জিএনইউ / লিনাক্সের মতো কাজ করে -i, ব্যাকআপের কোনও এক্সটেনশন নির্দিষ্ট করা যায় না)।

যেমন ইসমাইল সুপারিশ করে,

পার্ল যেহেতু আমি যেখানেই করি না কেন সর্বত্র উপলব্ধ perl -pi -e s,foo,bar,g target.file

এবং এটি sed -iজিএনইউ / লিনাক্স এবং বিএসডি / ম্যাকের মধ্যে মৌলিক অসামঞ্জস্যতা মোকাবেলার জন্য স্ক্রিপ্ট, উপকরণ বা অন্যান্য কাজের ক্ষেত্রগুলির চেয়ে প্রায় কোনও ক্ষেত্রেই ভাল সমাধানের মতো বলে মনে হয় ।


আমি এই সমাধান ভালোবাসি। perlমে 1, 2009 সাল থেকে লিনাক্স স্ট্যান্ডার্ড বেজ স্পেসিফিকেশন অংশ refspecs.linuxfoundation.org/LSB_4.0.0/LSB-Languages/...
OregonTrail

1
এটি সহজেই বহনযোগ্যতার জন্য সেরা সমাধান
ইকনেপসনাই

17

এটি কাজ করার কোনও উপায় নেই।

একটি উপায় হ'ল অস্থায়ী ফাইল ব্যবহার করা যেমন:

TMP_FILE=`mktemp /tmp/config.XXXXXXXXXX`
sed -e "s/abc/def/" some/file > $TMP_FILE
mv $TMP_FILE some/file

এটি উভয় উপর কাজ করে


SOME_FILE = "$ (sed -s" s / abc / def / "কিছু / ফাইল)" এর কোনও কারণ আছে কি; প্রতিধ্বনি "$ SOME_FILE"> কিছু / ফাইল; পরিবর্তে কাজ করবে না
জেসন গ্রস

দেখে মনে হচ্ছে আপনি কোনও ব্যাশ ভেরিয়েবলের সর্বাধিক আকার দ্বারা সীমাবদ্ধ হবেন, না? নিশ্চিত নয় এটি জিবিএস ফাইলগুলির সাথে কাজ করবে।
এনালগ

3
যদি আপনি একটি অস্থায়ী ফাইল তৈরি করে থাকেন তবে @ কাইন নীচের পরামর্শ হিসাবে কেবল ব্যাকআপ ফাইল (যা আপনি এরপরে মুছতে পারেন) তৈরি করতে কেবল একটি এক্সটেনশান দিচ্ছেন না কেন?
অ্যালেক্স ডুপুয়

13

উত্তর: না।

মূলত গৃহীত উত্তর আসলে যা অনুরোধ করা হয় তা করে না (মন্তব্যে উল্লিখিত হিসাবে)। ( file-eআমার ডিরেক্টরিতে "এলোমেলোভাবে" উপস্থিত হওয়ার কারণটি খুঁজতে গিয়ে আমি এই উত্তরটি পেয়েছি ))

sed -iম্যাকওএস এবং লিনুস উভয় ক্ষেত্রেই ধারাবাহিকভাবে কাজ করার কোনও উপায় নেই ।

আমার সুপারিশটি যা মূল্যবান তা হ'ল জায়গাটিতে আপডেট হওয়া sed(যার জটিল ব্যর্থতা মোড রয়েছে) নয়, তবে নতুন ফাইলগুলি তৈরি করা এবং তার পরে নাম পরিবর্তন করা। অন্য কথায়: এড়ানো -i


9

-iবিকল্প অংশ নয় POSIX ব্যান্ডউইডথ । এক্স মোডে ভিম ব্যবহার করা আরও একটি বহনযোগ্য পদ্ধতি হ'ল:

ex -sc '%s/alfa/bravo/|x' file
  1. % সমস্ত লাইন নির্বাচন করুন

  2. s প্রতিস্থাপন করা

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


এটা সঠিক উত্তর. পসিক্সের একটি মূল বৈশিষ্ট্য হ'ল বহনযোগ্যতা।
কাজুকেনবো

9

এখানে আরও একটি সংস্করণ রয়েছে যা evalব্যাকআপ ফাইলগুলি মোছা না করে এবং লিনাক্স এবং ম্যাকোস-এ কাজ করে । এটি sedপরামিতিগুলি সংরক্ষণ করার জন্য বাশ অ্যারে ব্যবহার করে , যা ব্যবহারের চেয়ে পরিষ্কার eval:

# Default case for Linux sed, just use "-i"
sedi=(-i)
case "$(uname)" in
  # For macOS, use two parameters
  Darwin*) sedi=(-i "")
esac

# Expand the parameters in the actual call to "sed"
sed "${sedi[@]}" -e 's/foo/bar/' target.file

এটি ব্যাকআপ ফাইল তৈরি করে না, সংযুক্ত উদ্ধৃতি সহ কোনও ফাইলও তৈরি করে না।


2
এটা সঠিক উত্তর. আমি এটিকে কিছুটা সহজ করে তুলব, তবে ধারণাটি পুরোপুরি কার্যকর করে sedi=(-i) && [ "$(uname)" == "Darwin" ] && sedi=(-i '') sed "${sedi[@]}" -e 's/foo/bar/' target.file
অ্যালেক্স স্ক্রিপ্যন্যিক

ভাল জিনিস! যদিও আমি পঠনযোগ্যতার জন্য দীর্ঘ সংস্করণটি পছন্দ করি।
নিমন্ত্রণ

1
এটি আমার জন্য বিভিন্ন সিস্টেমের সাথে সামঞ্জস্য করার সেরা উপায়।
ভিক্টর চয়ে

6

স্টিভ পাওলের উত্তরটি বেশ সঠিক, ওএসএক্স এবং লিনাক্সের জন্য উবুন্টু 12.04 এর জন্য এমএএন পৃষ্ঠার সাথে পরামর্শ করে দুটি অপারেটিং সিস্টেমের মধ্যে 'ইন-প্লেস' শেড ব্যবহারের সাথে সামঞ্জস্যতা তুলে ধরেছে।

জেএফওয়াইআই, সিডের লিনাক্স সংস্করণ ব্যবহার করে -i এবং কোনও উদ্ধৃতি (যা একটি ফাঁকা ফাইল এক্সটেনশন বোঝায়) এর মধ্যে কোনও স্থান থাকতে হবে না

লিনাক্স ম্যান পৃষ্ঠা

#Linux
sed -i"" 

এবং

সেড ওএসএক্স ম্যান পৃষ্ঠা

#OSX (notice the space after the '-i' argument)
sed -i "" 

আমি একজন alias'd কমান্ড 'এর অপারেটিং সিস্টেম-নাম আউটপুট ব্যবহার করে একটি স্ক্রিপ্টের মধ্যে এই রাউন্ডে পেয়েছিলাম uname একটি ব্যাশ মধ্যে' 'যদি'। ওএস-নির্ভরশীল কমান্ড স্ট্রিংগুলি ভেরিয়েবলগুলিতে সঞ্চয় করার চেষ্টা করা হয়েছিল এবং উদ্ধৃতিগুলি ব্যাখ্যা করার সময় মিস হয়েছিল। 'ব্যবহারের shopt -s expand_aliases ' অর্ডার প্রসারিত / alias লেখা আপনার স্ক্রিপ্টের মধ্যে সংজ্ঞায়িত ব্যবহার করার জন্য প্রয়োজন। shopt ব্যবহারের মোকাবেলা হয় এখানে


1

যদি আপনাকে sedকোনও bashস্ক্রিপ্টে জায়গা-জায়গায় করার দরকার হয় এবং আপনি চাইছেন না যে জায়গাটি .bkp ফাইলের সাথে ফলস্বরূপ হয় এবং আপনার ওএস সনাক্ত করার উপায় রয়েছে (বলুন, ostype.sh ব্যবহার করে ), তবে bashশেল অন্তর্নির্মিত নিম্নলিখিত হ্যাক evalকাজ করা উচিত:

OSTYPE="$(bash ostype.sh)"

cat > myfile.txt <<"EOF"
1111
2222
EOF

if [ "$OSTYPE" == "osx" ]; then
  ISED='-i ""'
else # $OSTYPE == linux64
  ISED='-i""'
fi

eval sed $ISED 's/2222/bbbb/g' myfile.txt
ls 
# GNU and OSX: still only myfile.txt there

cat myfile.txt
# GNU and OSX: both print:
# 1111
# bbbb

# NOTE: 
# if you just use `sed $ISED 's/2222/bbbb/g' myfile.txt` without `eval`,
# then you will get a backup file with quotations in the file name, 
# - that is, `myfile.txt""`

0

আপনি স্পঞ্জ ব্যবহার করতে পারেন। স্পঞ্জ একটি পুরানো ইউনিক্স প্রোগ্রাম, মুরতুল প্যাকেজে পাওয়া যায় (উভয় উবুন্টু এবং সম্ভবত ডেবিয়ান এবং ম্যাকের হোমব্রিউতে)।

এটি পাইপ থেকে সমস্ত সামগ্রী বাফার করবে, পাইপটি বন্ধ না হওয়া পর্যন্ত অপেক্ষা করুন (সম্ভবত অর্থাত ইনপুট ফাইলটি ইতিমধ্যে নিকটে রয়েছে) এবং তারপরে ওভাররাইট:

থেকে man পৃষ্ঠা :

সংক্ষিপ্তসার

সেড '...' ফাইল | গ্রেপ '...' | স্পঞ্জ ফাইল


3
চমৎকার পন্থা - দুর্ভাগ্যক্রমে আসল পরিস্থিতিটিতে সত্যিকার অর্থে সহায়তা করে না কারণ ক্লায়েন্ট মেশিনে ব্যবহৃত ক্রস-প্ল্যাটফর্ম সহায়তা সহায়ক স্ক্রিপ্টটিতে কিছু ব্যবহার করার দরকার ছিল যেখানে আপনি সিস্টেম ব্যতীত অন্য কোনও কিছুর উপর নির্ভর করতে পারবেন না sed সরঞ্জাম ইনস্টল করা হচ্ছে। তবে অন্য কারও জন্য সহায়ক হতে পারে।
dnadlinger

0

নিম্নলিখিতগুলি লিনাক্স এবং ওএস এক্সে আমার জন্য কাজ করে:

sed -i' ' <expr> <file>

যেমন একটি ফাইল fসমন্বিত জন্যaaabbaaba

sed -i' ' 's/b/c/g' f

aaaccaacaলিনাক্স এবং ম্যাক উভয় উপর ফলন । মনে রাখবেন যে কোনো উদ্ধৃত পংক্তি আছে একটি স্থান ধারণকারী সঙ্গে, কোন স্থান মধ্যে -iএবং স্ট্রিং। একক বা ডাবল উদ্ধৃতি উভয়ই কাজ করে।

লিনাক্সে আমি bashউবুন্টু 14.04.4 এর অধীনে 4.3.11 সংস্করণ এবং ম্যাক সংস্করণে 3.2.57 ওএস এক্স 10.11.4 এল ক্যাপিটান (ডারউইন 15.4.0) এর অধীন ব্যবহার করছি ।


1
বাহ, আমি আনন্দিত যে আমি উপরের সবাইকে এটি অসম্ভব বলে বলেছি এবং পড়া চালিয়েছি! এটি সত্যিই ঠিক কাজ করে। ধন্যবাদ!
ব্যক্তি

4
ম্যাক ওএসে আমার জন্য কাজ করে না ... ফাইলের শেষের সাথে স্থান যুক্ত নতুন ফাইল তৈরি করা হয়েছে
ফ্রেডেরিক

ম্যাক (/ usr / bin / sed) - এ আমার জন্যও কাজ করে না - আমার কাছে এখন ফাইলের নামের সাথে স্থান যুক্ত একটি অতিরিক্ত ব্যাকআপ ফাইল রয়েছে :-(
পাউল_h

একক উদ্ধৃতিগুলির বাইরে স্থান নেওয়ার চেষ্টা করুন, এটি আমার পক্ষে কাজ করে।
ডিপিএস

0

আমি এই সমস্যা মধ্যে দৌড়ে। একমাত্র দ্রুত সমাধানটি হ'ল ম্যাকের সেডটিকে ম্যানু সংস্করণে প্রতিস্থাপন করা:

brew install gnu-sed

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