ম্যাক ওএসএক্স এবং অন্যান্য "স্ট্যান্ডার্ড" সেডের মধ্যে পার্থক্য?


61

এই সাইটের জন্য প্রদত্ত একটি উত্তরটি ব্যবহার করার ক্ষেত্রে আমার কাছে এই সমস্যাটির জন্য এই দুটি প্রশ্নের জন্য একটি ফাঁকা রেখা প্রতিস্থাপনের জন্য ফাঁকা রেখাটি অন্য দুটি লাইনের কন্টেন্টের সাথে একটি সিড কমান্ড সম্পর্কে জবাবদিহি করতে সমস্যা হয়েছে এবং যদি এটি ম্যাক ওএসে সিড কমান্ড (10.6.7 ) এটা ভিন্ন. আমি এটি মনে করি না, তবে এই সাইটের অন্যরা যদি অন্যরকমভাবে চিন্তা করেন তবে ভাবছিলাম।

উত্তর:


43

শেল ইউটিলিটির আচরণগুলি ইউনিক্স বৈকল্পের মধ্যে গৌণ উপায়ে পৃথক হয়। জটিল ইতিহাস সহ অনেকগুলি ইউনিক্স বৈকল্পিক রয়েছে । আছে প্রমিতকরণ প্রচেষ্টা যেমন POSIX মান এবং তার সুপারসেটও একক ইউনিক্স স্পেসিফিকেশন । বেশিরভাগ সিস্টেম আজকাল POSIX: 2001 বাস্তবায়ন করে, যা একক UNIX স্পেসিফিকেশন সংস্করণ 3 নামেও পরিচিত , ছোটখাটো বিচ্যুতি এবং অনেকগুলি এক্সটেনশন। সিঙ্গেল ইউনিক্সের স্পেসিফিকেশন টিউটোরিয়াল নয়, তবে আদেশটি কী করছে তা আপনার যদি ইতিমধ্যে ধারণা থাকে তবে সংস্করণ 3টি পঠনযোগ্য। কিছু বৈশিষ্ট্য মানক বা কোনও নির্দিষ্ট সিস্টেমের এক্সটেনশন কিনা তা জানতে আপনি এটির পরামর্শ নিতে পারেন।

বেশিরভাগ ইউনিক্স ব্যবহারকারী লিনাক্স ব্যবহার করেন এবং অন্য কোনও রূপ ব্যবহার করেন নি। লিনাক্স জিএনইউ ইউটিলিটিগুলির সাথে আসে , যার প্রায়শই স্ট্যান্ডার্ডে অনেকগুলি এক্সটেনশন থাকে। সুতরাং আপনি সেখানে অনেকগুলি কোড খুঁজে পাবেন যা লিনাক্সে কাজ করে তবে অন্যান্য ইউনিসগুলিতে নয়, কারণ এটি সেই এক্সটেনশনের উপর নির্ভর করে।

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

জিএনইউ সেডের নন-স্ট্যান্ডার্ড এক্সটেনশনগুলির মধ্যে একটি একসাথে চালিত একাধিক কমান্ডকে সমর্থন করে। উদাহরণস্বরূপ, এই GNU সেড প্রোগ্রামটি সমস্ত লাইনগুলিকে মুদ্রণ করে aতবে প্রথমে পরিবর্তিত bহয় c:

sed -ne '/a/ {s/b/c/g; p}'

{এবং }প্রকৃতপক্ষে পৃথক কমান্ড, সুতরাং সম্পূর্ণ পোর্টেবিলিটির জন্য আপনাকে সেগুলি পৃথক লাইনগুলিতে (কোনও ফাইলের মধ্যে) বা পৃথক -eযুক্তি (কমান্ড লাইনে) দ্বারা নির্দিষ্ট করতে হবে। কমান্ড বিভাজকের পরে কোনও কমান্ড বিভাজকের অভাব এবং কমান্ড বিভাজক হিসাবে {ব্যবহার করা ;সাধারণ এক্সটেনশন। আগে কমান্ড বিভাজকের অভাব }কম সাধারণ এক্সটেনশন। এটি স্ট্যান্ডার্ড-কমপ্লায়েন্ট:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

এটি মানহীন তবে সাধারণত গৃহীত:

sed -ne '/a/ { s/b/c/g; p; }'

অন্য একটি মানহীন তবে সাধারণ এক্সটেনশান হ'ল প্রতিস্থাপন পাঠ্যে \nএকটি নতুন লাইন বোঝানো s(একটি রেজিপ্লেক্সের ব্যবহার মানক)। পোর্টেবল পদ্ধতিটি সেড স্ক্রিপ্টে ব্যাকস্ল্যাশ-নিউলাইন অন্তর্ভুক্ত করা হয়। আর একটি সাধারণ এক্সটেনশান হ'ল \+, \?এবং \|এক বা একাধিককে বোঝাতে রিজেক্সপসে সর্বাধিক এক এবং বিকল্প; পোর্টেবল বেসিক নিয়মিত এক্সপ্রেশনগুলির এগুলির কোনও একটিই নেই। উদাহরণস্বরূপ, প্রথম কমান্ডটি হ'ল স্পেসের সামঞ্জস্যপূর্ণ ক্রমগুলি একটি নতুন লাইন দ্বারা প্রতিস্থাপনের একটি অ বহনযোগ্য উপায়; দ্বিতীয় কমান্ডটি একটি মান-সম্মতিযুক্ত সমতুল্য।

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

নোট করুন যে জিএনইউ এক্সটেনশান সম্পর্কিত সমস্ত ক্ষেত্রে, এটি ব্যবহার যা অ-মানক। sedমানক দ্বারা জিনিসগুলি অনুমোদিত (তবে প্রয়োজনীয় নয়, অনির্ধারিত) হিসাবে জিএনইউ নিজেই অনুগত l এমন কিছু ঘটনা রয়েছে যেখানে এটি অনুগত নয় এবং যেখানে POSIXLY_CORRECTপরিবেশে এটি চালানো সাহায্য করতে পারে। এটির মতো s/[\n]//gঅবশ্যই ব্যাকল্যাশ এবং nঅক্ষরগুলি অবশ্যই সরিয়ে ফেলতে হবে তবে পরিবর্তে নতুন লাইনগুলি সরিয়ে ফেলতে হবে। বা Nশেষ লাইনে কমান্ডের আচরণ ।
স্টাফেন চ্যাজেলাস

sed -ne '/a/ { s/b/c/g; p; }'স্ট্যান্ডার্ড এর 2016 সংস্করণ থেকে মান। এটি সর্বদা বহনযোগ্য ছিল। অস্ট্রিংগ্রপবগসনেট
স্টাফেন

60

ওএস এক্স বর্তমানে একটি ফ্রিবিএসডি সেডের সাথে 2005 সাল থেকে আসে below নীচের বেশিরভাগ পার্থক্যগুলি অন্যান্য বিএসডি সেড সংস্করণগুলিতেও প্রযোজ্য।

ওএস এক্স এর সেড -Eইআর এবং জিএনইউ সেড ব্যবহারের জন্য ব্যবহার করে -r। জিএনইউ সেডের -Eএকটি উপনাম -r(৪.২-তে যুক্ত হয়েছে, ৪.৩ পর্যন্ত ডকুমেন্টেড নয়)। FreeBSD 'র এবং NetBSD বা কিন্তু এর একটি নবীনতর সংস্করণ উভয় সমর্থন -Eএবং -r। ওপেনবিএসডি সেড কেবল সমর্থন করে -E

-i ''ওএস এক্স এর সিডের সাথে কাজ করে তবে জিএনইউ সেড নয়। -iজিএনইউ সেডের সাথে কাজ করে, নেটবিএসডি, ওপেনবিএসডি এর সাম্প্রতিক সংস্করণ sed, তবে ওএস এক্স এর সেড নয়। -i -eউভয়ের সাথেই কাজ করে তবে ফ্রিবিএসডি ক্ষেত্রে ফাইলের নামের sedসাথে -eযুক্ত হয়ে মূল ফাইলটির ব্যাকআপ তৈরি করে (এবং আপনার কাছে একাধিক এক্সপ্রেশন পাস করার দরকার নেই sed)।

গনুহ sed ব্যাখ্যা মত সিকোয়েন্স অব্যাহতি \t, \n, \001, \x01, \w, এবং \b। ওএস এক্স এর সেড এবং পসিক্স সেড কেবল ব্যাখ্যা করে \n(তবে এর প্রতিস্থাপন অংশে নয় s)।

জিএনইউ সেড ব্যাখ্যা করে \|, \+এবং \?বিআরই তে কিন্তু ওএস এক্স এর সেড এবং পসিক্স সেড করে না। \(, \), \{, এবং \}POSIX BRE হয়।

জিএনইউ সেড বাদ দেওয়ার ;আগে বা একটি নতুন লাইন অনুমতি দেয় }তবে ওএস এক্স এর সেড দেয় না।

i(সন্নিবেশ), a(সংযোজন), এবং c(পরিবর্তন) একটি ব্যাকস্ল্যাশ এবং ওএস এক্স এর সেড এবং পসিক্স সেডে একটি নতুন লাইন অনুসরণ করতে হবে তবে জিএনইউ সেডে নয়। গনুহ কিন্তু টেক্সট দ্বারা সন্নিবেশিত পর একটি অনুপস্থিত সম্পর্কে newline যোগ i, aঅথবা cকিন্তু OS X এর এর sed না। উদাহরণস্বরূপ sed 1iaএকটি জিএনইউ বিকল্প sed $'1i\\\na\n'

উদাহরণস্বরূপ printf a|sed -n p, ওএস এক্স এর সেডে একটি নতুন লাইন যুক্ত হয়েছে তবে জিএনইউ সেডে নয়।

ওএস এক্স এর শেড I(কেস-সংবেদনশীল) বা M(মাল্টি-লাইন) সংশোধকগুলিকে সমর্থন করে না । ফ্রিবিএসডি এর নতুন সংস্করণগুলি সেড সমর্থন I

ওএস এক্স এর সেড -s( --separate), -u( --unbuffered), বা -z( --null-data) সমর্থন করে না ।

এক বাসদ বিকল্পটি গনুহ দ্বারা সমর্থিত নয় sed হয় -a, যার ফলে wএর পরিবর্তে একটি ফাইল ছিন্ন একটি ফাইলে লিখবেন।

জিএনইউ সেড কমান্ডগুলির উদাহরণ যা ওএস এক্স এর সিডের সাথে কাজ করে না:

sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping

4
-i -eওএসএক্সে কাজ করে না। এটি -eপ্রত্যয় হিসাবে ইন্টারপেট করে।
ক্রিস মার্টিন

3
@ ক্রিসমার্টিন হ্যাঁ, ওএস এক্স সংস্করণে -iসর্বদা প্রত্যয় প্রয়োজন, এমনকি খালি স্ট্রিং থাকলেও। তাই -i '' -eকাজ করা উচিত।
ওয়াল্ডরিয়াস

@ ওয়ালডিরিয়াস এটি কেবল ওএসএক্স-এ কাজ করে।
ক্রিস মার্টিন

হ্যাঁ, এটি সেই সংস্করণটির একটি
স্পর্শ

3
" -i -eউভয়ের সাথে কাজ করে " বাক্যটি । আপনার উত্তরে বোঝা যাচ্ছে একটি ক্রস-প্ল্যাটফর্ম সমাধান রয়েছে। স্পষ্টতই নেই।
লিওনডিপিয়ন

5

লিনাক্স এবং ম্যাক উভয় ক্ষেত্রে একই স্ক্রিপ্টের কাজটি আমি খুঁজে পেয়েছি তার মধ্যে সবচেয়ে ভাল উপায়:

sed -i.bak -e 's/foo/bar/' -- "${TARGET}" &&
  rm -- "${TARGET}.bak"

বা perlযেখান -iথেকে আসে তা ব্যবহার করুন । perl -Tpi -e 's/foo/bar/' -- "$TARGET"
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.