সেডে গল্ফ করার টিপস


19

সেডে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা কোড-গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে এবং যা সেডের ক্ষেত্রেও অন্তত কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।

দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


4
সত্যিই কোনও গল্ফিং টিপ নয় (তবে গল্ফ করার জন্য এখনও একটি টিপ): লাইনফিডগুলি সেমিকোলনগুলির মতো ঠিক অনেকগুলি বাইট গ্রাস করে, তাই আপনি আপনার কোডটি সংক্ষিপ্ত এবং পঠনযোগ্য রাখতে পারেন ।
ডেনিস

কোনও টিপ নয়, তবে একটি সমস্যা: আমি জিএনইউ সিড করেছি, তবুও Fকমান্ডটি কখনই কার্যকর হয়নি। কোন এক কেন জানেন না?
শৈশুমারা

@ সেশৌমারা Fআমার জিএনইউ সেডে ( দেবিয়ান পরীক্ষা) কাজ করে। এটি -স্ট্যান্ডিনের কাছ থেকে পড়ে অবশ্যই প্রিন্ট করে তবে অবশ্যই এটি প্রত্যাশিত। আপনি কি পেতে sed -e 'F;Q' /etc/hostname?
টবির গতি

@TobySpeight যে এটি একটি ত্রুটি দেয়: char 1: unknown command: F। আমি সম্ভবত সেড আপডেট করতে হবে; আপনার কি সংস্করণ আছে? Lকমান্ড এছাড়াও কাজ করে না, কিন্তু যেহেতু এটা বেহুদা যাহাই হউক না কেন এর -l nবিদ্যমান। জিএনইউ সেডের সাইটে উল্লিখিত সমস্ত কিছুই কাজ করে।
শৈশুমারা

1
bash, sed and dcযারা এই ভাষাগুলি সম্পর্কে কথা বলতে এবং জিজ্ঞাসা করতে চান তাদের জন্য আমি চ্যাট রুমটি খুললাম । আসুন একটি সম্প্রদায় তৈরি করা যাক!
শৈশুমারা

উত্তর:


11

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

:    # define label ""
p    # print pattern space
b    # infinite loop! - branch to label ""

4
4.3 gnu হিসাবে, এই আচরণটি সরানো হয়েছে:এখন একটি লেবেল প্রয়োজন।
কেভিন

প্রকৃতপক্ষে, এখানে আসল গিট কমিট লিঙ্কও রয়েছে । আমার ধারণা পিপিসিজির জন্য এটি খুব বেশি পরিবর্তন ঘটবে না, যেহেতু আমাদের জিএনইউ সেড ৪.২.x এর জন্য উত্তর পোস্ট করার অনুমতি দেওয়া হয়েছে তবে আফসোস হলেও, এই কৌশলটি আর অফিসিয়ালি কাজ করবে না তা জানা ভাল।
শৈশুমারা

8

গনুহ sed ডকুমেন্টেশন বর্ণনা sযেমন কমান্ড "sed এর সুইস আর্মি নাইফ" । তবে আপনি যদি যা করতে চান তা হ'ল একটি চরিত্রের সমস্ত উদাহরণকে অন্য সাথে প্রতিস্থাপন করা হয়, তবে yকমান্ডটি আপনার যা প্রয়োজন তা হল:

y/a/b/

এর চেয়ে কম একটি চরিত্র:

s/a/b/g

এটিও দ্রুত গতিতে y/12/21/
চলেছে

6

বর্ধিত রেজেক্স সিনট্যাক্স (জিএনইউ সেডে) ব্যবহার বিবেচনা করুন। -rবিকল্প স্কোরিং এক বাইট খরচ, কিন্তু এটা ব্যবহার করে শুধু একবার একজোড়া থেকে ব্যাকস্ল্যাশ নির্মূল করার \(...\)ইতিমধ্যে নিজেই জন্য দেওয়া হয়েছে।


2
অতিরিক্ত নোট যা -rজিএনইউ sedনির্দিষ্ট বলে মনে হচ্ছে With
manatwork

@ মানাত - যোগ হয়েছে (তবে এটি একটি সম্প্রদায়ের উইকির উত্তর, যাতে আপনি নিজেরাই সম্পাদনা করতে পারতেন)।
টবি স্পিড

অবশ্যই. আমি এটিকে টিপের অংশ হিসাবে বিবেচনা করি নি, কেবল একটি অতিরিক্ত নোট।
manatwork

এবং এটা নিজেই জন্য পরিশোধ করা রাখে যখন ব্যবহার +, ?, {}এবং |Regex ম্যাচে, যেহেতু কোন ব্যাকস্ল্যাশ পারেন প্রয়োজন হয়।
শৈশুমারা

-Eযদি আমি সঠিকভাবে মনে করি তবে -rঅনেকগুলি sedপ্রয়োগে একটি উপাধি হিসাবে কাজ করে ।
পিএইচকে

6

যখন বারবার একটি লুপে প্রতিস্থাপন করা হয়:

loop:
s/foo/bar/g
tloop

এটি সাধারণত বিশ্বব্যাপী প্রতিস্থাপন করা অপ্রয়োজনীয়, কারণ লুপটি শেষ পর্যন্ত সমস্ত উপস্থিতি প্রতিস্থাপন করে:

# GNU sed
:
s/foo/bar/
t

উপরের জিএনইউ এক্সটেনশনটিও নোট করুন: একটি লেবেলে খালি নাম থাকতে পারে, আরও মূল্যবান বাইট সংরক্ষণ করা যায়। অন্যান্য বাস্তবায়নে কোনও লেবেল খালি থাকতে পারে না, এবং কোনও লেবেল স্থানান্তরিত না করে লাফাই স্ক্রিপ্টের শেষে প্রবাহিত হয় (যেমন একই n)।


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

2
নামহীন লেবেলটি সর্বদা জিএনইউ সেডে একটি বাগ ছিল, কোনও এক্সটেনশন নয়, সংস্করণ ৪.৩ এবং এর চেয়েও উচ্চতর এই বাগটি ছিল দুঃখজনকভাবে, স্থির ছিল। এখানে দেখুন ।
শৈশুমারা

5

এখানে কোনও অন্তর্নির্মিত পাটিগণিত নেই, তবে গণনাগুলি অ্যানারি বা অ্যানারি-কোডড দশমিক ক্ষেত্রে করা যেতে পারে। নিম্নোক্ত কোডটি দশমিক দশকে ইউসিডিতে রূপান্তর করে, এক্সকে ইউনিট হিসাবে এবং 0 টি সংখ্যার বিভাজক হিসাবে:

s/[1-9]/0&/g
s/[5-9]/4&/g
y/8/4/
s/9/4&/g
s/4/22/g
s/[37]/2x/g
s/[26]/xx/g
s/[1-9]/x/g

এবং এখানে দশমিককে রূপান্তর করা হয়েছে:

s/0x/-x/g
s/xx/2/g
y/x/1/
s/22/4/g
s/44/8/g
s/81/9/g
s/42/6/g
s/21/3/g
s/61/7/g
s/41/5/g
s/-//g

এই দুটিই নেওয়া হয়েছে "কোনও সংখ্যা ব্যবহার না করে দুটি সংখ্যা গুণিত করুন" এর উত্তর

সরল পুরানো আনারি এই উত্তরটি "{কোঁকড়া সংখ্যা}" থেকে এই জোড়া লুপ ব্যবহার করে রূপান্তর করা যেতে পারে ; , যেখানে ইউনিট ;। আমি ব্যবহার করেছি vএবং xজন্য রোমান মেলে 5এবং 10; b"বিস" থেকে আসে।

# unary to decimal
:d
/;/{
s/;;;;;/v/g
s/vv/x/g
/[;v]/!s/x\+/&0/
s/;;/b/g
s/bb/4/
s/b;/3/
s/v;/6/
s/vb/7/
s/v3/8/
s/v4/9/
y/;bvx/125;/
td
}

# Decimal to unary
:u
s/\b9/;8/
s/\b8/;7/
s/\b7/;6/
s/\b6/;5/
s/\b5/;4/
s/\b4/;3/
s/\b3/;2/
s/\b2/;1/
s/\b1/;0/
s/\b0//
/[^;]/s/;/&&&&&&&&&&/g
tu

1
... এবং যদি আপনি এর মধ্যে দুটি ব্যবহার করতেই পারেন তবে আপনি অবশ্যই ইতিমধ্যে কোড গল্ফটি হারিয়ে ফেলেছেন, যদিও আপনি এখনও জাভা উত্তরগুলির সাথে প্রতিযোগিতামূলক হতে পারেন ;-) তবে এখনও মজাদার ব্যবহার করতে পারেন।
ডিজিটাল ট্রমা

দশমিক কাছে স্পষ্ট ইউনারী থেকে রুপান্তরের উদাহরণ 108. লাইন এর জন্য দায়ী জন্য দশমিক ফর্ম X0X এর ইউনারী ইনপুট সমতুল্য জন্য ভুল উত্তর দেয়, হয় /[;v]/!s/\b/0/2যা পরিবর্তন করা প্রয়োজন, /[;v]/!s:x\+:&0:কাজ তার জন্য। এখানে দেখুন ।
শৈশুমারা

@ সেশৌমারা, আপনার লিঙ্কটি একটি খালি পৃষ্ঠা বলে মনে হচ্ছে। তবে এটি সম্পূর্ণরূপে প্রশংসনীয় যে রেফারেন্সড উত্তর থেকে কোডটি বের করার সময় আমি একটি ত্রুটি করেছি, তাই আমি কেবল আপনার সমাধানটি প্রয়োগ করব।
টবি স্পিড

লিঙ্কটি সঠিকভাবে লোড হয়েছে, তবে আমি "টিআইও" দিয়ে ধূসর পৃষ্ঠা ছাড়া অন্য কিছু এবং উবুন্টু লোগোর মতো দেখতে এমন কিছু প্রত্যাশা করছিলাম - এটি কি উদ্দেশ্য? এবং আমি যে উত্তরগুলি উল্লেখ করেছি তার দ্বিতীয়টির দিকে আমি উল্লেখ করছিলাম ( 58007 ), যেখানে প্লেইন-ইউনিারি নমুনা উত্পন্ন হয়েছিল।
টবি স্পিড

টিআইও লিঙ্কটিতে সংশোধন কোড, প্লাস একটি উদাহরণ ইনপুট, 108 থাকা উচিত। কোডটি চালানোর সময় আপনার সঠিক ফলাফলটি 108 টি দেখতে হবে, এবং 180 টি নয়, আগের কোডের বর্তমানে নির্দিষ্ট লাইন দ্বারা উত্পন্ন as রেফারেন্স করা উত্তর আপডেট করা সম্পূর্ণরূপে আপনার উপর নির্ভর করে। এটি একটি সম্প্রদায় উইকি
শৈশুমারা

4

man sed(জিএনইউ) তে উল্লিখিত হিসাবে , সিনট্যাক্স ব্যবহার করে আপনি যে কোনও চরিত্রকে নিয়মিত প্রকাশের জন্য ডিলিমিটার হিসাবে ব্যবহার করতে পারেন

\%regexp%

যেখানে %কোনও চরিত্রের জন্য স্থানধারক।

এটি কমান্ডগুলির মতো কার্যকর

/^http:\/\//

যা হিসাবে খাটো হয়

\%^http://%

কি উল্লেখ করা হয় গনুহ ম্যানুয়াল sed কিন্তু নাman sedযে আপনি বিভেদক পরিবর্তন করতে পারেন s///এবং y///হিসাবে ভাল।

উদাহরণস্বরূপ, কমান্ড

ss/ssg

প্যাটার্ন স্পেস থেকে সমস্ত স্ল্যাশ সরিয়ে দেয়।


4

যদি প্রশ্ন দ্বারা সুস্পষ্টভাবে নিষিদ্ধ না করা হয় তবে এই মেটা প্রশ্নের জন্য conকমত্যটি সংখ্যাসূচক ইনপুট অবিচ্ছিন্ন হতে পারে। এটি আপনাকে উত্তর হিসাবে মিল হিসাবে দশমিক দশমিক 86 বাইট সংরক্ষণ করে ।


সাদামাটা প্লেইন পুরানো unary ফর্ম্যাট উল্লেখ করে যে মেটা conক্যমত্য না? আমার বেশ কয়েকটি উত্তর রয়েছে যেখানে ইউসিডিতে একটি ইনপুট আমাকে সহায়তা করবে, যদি এটি হয় তবে।
শৈশুমারা

@seshoumara আমি বোঝাতে চাইছি একাকার, ইউসিডি নয়
ডিজিটাল ট্রমা

তারপরে দশমিক থেকে প্লেইন পুরানো আনারিতে রূপান্তরকরণ আপনার উত্তরটির সাথে যুক্ত উত্তর অনুসারে 126 বাইট সংরক্ষণ করে। 86 টি বাইট ইউসিডিতে রূপান্তর করার জন্য।
শৈশুমারা

4

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

দশমিক প্লেইন আনারি: 102 + 1 (আর ফ্ল্যাগ) = 103 বাইট। আমি \tআক্ষরিক ট্যাব হিসাবে 1 বাইট হিসাবে গণনা করেছি ।

h
:
s:\w::2g
y:9876543210:87654321\t :
/ /!s:$:@:
/\s/!t
x;s:-?.::;x
G;s:\s::g
/\w/{s:@:&&&&&&&&&&:g;t}

এটি অনলাইন চেষ্টা করুন!

সুবিধা: এটি 22 বাইট সংক্ষিপ্ত এবং অতিরিক্ত হিসাবে এটি ইনপুট হিসাবে নেতিবাচক পূর্ণসংখ্যার সাথে কাজ করে

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

দশমিকের সমান সমান: 102 + 1 (আর পতাকা) = 103 বাইট

s:-?:&0:
/@/{:
s:\b9+:0&:
s:.9*@:/&:
h;s:.*/::
y:0123456789:1234567890:
x;s:/.*::
G;s:\n::
s:@::
/@/t}

এটি অনলাইন চেষ্টা করুন!

সুবিধা: এটি 14 বাইট ছোট। এবার উভয় টিপ সংস্করণ ইনপুট হিসাবে নেতিবাচক পূর্ণসংখ্যার জন্য কাজ করে।

অসুবিধা: এটি হোল্ড স্পেসকে ওভাররাইট করে

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

এই ধরনের চ্যালেঞ্জ উত্তরের একটি উদাহরণ, যেখানে আমি এই স্নিপেটগুলি তৈরি করেছি এবং ব্যবহার করেছি, তা হ'ল একটি সংখ্যার (1 / x) পারস্পরিক


ইউনারী টু দশমিক জন্য আপনি গত দুই বদল মিশ্রন দুটি বাইট সংরক্ষণ করতে পারেন: s:\n|@$::gtio.run/##K05N@f@/2ErX3krNwIpL30G/…
জর্ডান

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

আসলে আপনার কাছ থেকে শেষ লাইনটি পরিবর্তন /\n/taকরতে /\n/t, আপনি 96 পেতে 1 বাইট সংরক্ষণ
Kritixi Lithos

@ কৌজাক ধন্যবাদ, 96 দুর্দান্ত! এখনই সময় নেই, এই সপ্তাহান্তে এটি দেখতে পাবেন।
শৈশুমারা

অবশ্যই, আমাকে তখন
আড্ডায়

3

আসুন tএবং Tকমান্ডগুলি সম্পর্কে কথা বলি , যদিও সেগুলি ম্যান পৃষ্ঠায় ব্যাখ্যা করা হয়েছে, এটিকে ভুলে যাওয়া এবং দুর্ঘটনাক্রমে বাগগুলি প্রবর্তন করা সহজ, বিশেষত যখন কোডটি জটিল হয়।

ম্যান পেজ স্টেটমেন্ট এর জন্য t:

s///শেষ ইনপুট লাইনটি পড়ার পর থেকে এবং শেষ টি বা টি কমান্ডের পরে যদি কোনও সফল প্রতিস্থাপন কাজ করে থাকে তবে লেবেলে শাখা করুন।

উদাহরণস্বরূপ আমার অর্থ কী তা বোঝানো হচ্ছে: আসুন আমরা বলি যে আপনার সংখ্যার একটি তালিকা রয়েছে এবং আপনি সেখানে কতটা নেতিবাচক তা গণনা করতে চান। আংশিক কোড নীচে:

1{x;s/.*/0/;x}                   # initialize the counter to 0 in hold space
s/-/&/                           # check if number is negative
t increment_counter              # if so, jump to 'increment_counter' code block
b                                # else, do nothing (start a next cycle)

:increment_counter
#function code here

দেখতে ঠিক আছে, কিন্তু তা নয়। যদি প্রথম সংখ্যাটি ইতিবাচক হয় তবে সেই কোডটি এখনও এটি নেতিবাচক বলে মনে করবে, কারণ ইনপুটটির tপ্রথম লাইনের মাধ্যমে করা লাফটি নির্বিশেষে সঞ্চালিত হয়, যেহেতু sআমরা কাউন্টার শুরু করার সময় সেখানে একটি সফল প্রতিস্থাপন ছিল ! সঠিক:/-/b increment_counter

যদি এটি সহজ মনে হয় তবে ফাংশন সিমুলেট করার জন্য একাধিক জাম্প করার সময় আপনাকে বোকা বানানো যেতে পারে। আমাদের উদাহরণে increment_counterকোডের ব্লক নিশ্চিতভাবে অনেক sকমান্ড ব্যবহার করবে । সাথে ফিরে আসার b mainফলে "মেইন" এ অন্য একটি চেক একই ফাঁদে পড়তে পারে। এজন্য আমি সাধারণত কোড ব্লক দিয়ে ফিরে আসি s/.*/&/;t label। এটি কুরুচিপূর্ণ, তবে দরকারী।


2

প্যাটার্ন স্পেসটি পরিষ্কার করার পরিবর্তে, আপনি জিএনইউ সেডের সাথে গেলে কমান্ডটি (ছোট হাতের) s/.*//ব্যবহার করুন z। নিম্ন বাইট গণনা ছাড়াও, এর সুবিধা রয়েছে যে এটি পরবর্তী চক্রটি কমান্ডের মতো শুরু করবে না d, যা কিছু পরিস্থিতিতে কার্যকর হতে পারে।


1
আপনার যদি অবৈধ মাল্টি-বাইট সিকোয়েন্সগুলি (যা মিলছে না .) থেকেও উপকার পেতে পারে ।
টবি স্পিড

2

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

জন্য UCD দশমিক আমি ব্যবহারের (68 বাইট; সাবেক সেরা এখানে পোস্ট 87 বাইটস)

s/$/\n9876543210/
:a
s/\([1-9]\)\(.*\n.*\)\1\(.\)/\3x\2\1\3/
ta
P;d

দশমিক ইউসিডি হ'ল (এছাড়াও by 66 বাইট; প্রাক্তন সেরা পোস্ট এখানে 96৯)

s/$/\n0123456789/
:a      
s/\([0-8]\)x\(.*\n.*\)\1\(.\)/\3\2\1\3/
ta      
P;d
  • \nপ্রতিস্থাপনে পোর্টেবল হয় না। পরিবর্তে আপনি একটি পৃথক অক্ষর ব্যবহার করতে পারেন এবং দুটি বাইট সংরক্ষণ করতে পারেন, তবে পরিবর্তে পরিশিষ্ট অপসারণ করতে আপনার আরও বাইট প্রয়োজন হবে P;d; পরবর্তী মন্তব্য দেখুন। অথবা, যদি আপনার হোল্ডের স্থানটি খালি থাকে তবে করুনG;s/$/9876543210/ বাইট পেনাল্টি ছাড়াই করুন।
  • আপনার যদি আরও প্রক্রিয়াজাতকরণ প্রয়োজন হয় তবে আপনার s/\n.*//পরিবর্তে আরও কিছু বাইট দরকার needP;d
  • পুরানো জিএনইউ-র বগিগুলির জন্য আপনি দুটি করে বাইট সংরক্ষণ করতে পারেন sed সংস্করণগুলির
  • না, আপনি ছয়টি ব্যাকস্ল্যাশ সংরক্ষণ করতে পারবেন না কারণ বর্ধিত নিয়মিত এক্সপ্রেশনগুলি ব্যাকরিফারেন্স না করে

এই থ্রেডে পোস্ট হওয়া কোনও ইউসিডি এবং ব্যাক কনভার্টারের কোনও দশমিক নেই যা হোল্ড স্পেসে গণ্ডগোল করে বা ত্রুটিযুক্ত সেড সংস্করণ প্রয়োজন require
শৈশুমারা

April ই এপ্রিল থেকে আপনার নিজের উত্তর সোনার জায়গা ব্যবহার করে এবং কেবল পুরানো sedসংস্করণগুলির সাথে চলবে যা পসিক্স মানকে লঙ্ঘন করে।
ফিলিপস

আমি ইউসিডি রূপান্তরগুলিতে দশমিক করছি না! থ্রেডটি আবার সাবধানে পড়ুন। ইউসিডি এর অর্থ হল 12 টি 0x0xx এ রূপান্তরিত হয়েছে (আপনার উত্তরটি কী গণনা করে), যখন সরল আনরি (আমার উত্তর গণনা করে) এর অর্থ হল 12 টি এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএমে রূপান্তরিত। আমি @ প্রতীক হিসাবে বেছে নিয়েছি, তবে আপনি ধারণা পাবেন। এবং আরও, পিপিসিগিতে একটিতে পসিক্স মান মেনে চলার প্রয়োজন হয় না।
শৈশুমারা

আপনার খুশী হয় তাহলে শেরিফ
Philippos

2

একবারে পুরো ইনপুটটি পড়ুন -z

প্রায়শই আপনাকে একবারে এক লাইনের পরিবর্তে পুরো ইনপুটটিতে একবার চালনা করতে হবে। Nকমান্ড যে জন্য দরকারী:

:
$!{N;b}

... তবে সাধারণত আপনি এড়িয়ে যেতে পারেন এবং এটি ব্যবহার করতে পারেন -z পরিবর্তে পতাকা ।

-zপতাকা sed ব্যবহার NUL (তোলে \0পরিবর্তে তার ইনপুট লাইন বিভাজক হিসেবে) \n, তাই আপনি যদি জানেন আপনার ইনপুট থাকবে না \0, এটা এ ইনপুট সব পড়তে হবে একবার একটি একক "লাইন" আখ্যা দিয়েছেন:

$ echo 'foo
> bar
> baz' | sed -z '1y/ao/eu/'
fuu
ber
bez

এটি অনলাইন চেষ্টা করুন!


2

একটি বাইটে একটি নতুন লাইন যুক্ত করুন

Gকমান্ড একটি newline এবং প্যাটার্ন স্থান থেকে ধরে স্থান বিষয়বস্তু appends, তাই যদি আপনার হোল্ড স্থান, খালি পরিবর্তে এই সংখ্যা:

s/$/\n/

তুমি এটি করতে পারো:

G

তিন বাইটে একটি নতুন লাইন প্রস্তুত করুন

Hকমান্ড একটি newline এবং হোল্ড স্থান থেকে প্যাটার্ন স্থান বিষয়বস্তু appends, এবং xদুই বিনিময়সমূহ, তাই যদি আপনার হোল্ড স্থান, খালি পরিবর্তে এই সংখ্যা:

s/^/\n/

তুমি এটি করতে পারো:

H;x

এটি আপনার হোল্ড স্পেসকে দূষিত করবে, সুতরাং এটি কেবল একবারে কাজ করে। আরও দুটি বাইটের জন্য, যদিও আপনি অদলবদলের আগে আপনার প্যাটার্ন স্পেসটি সাফ করতে পারেন যা এখনও দুটি বাইটের সঞ্চয়:

H;z;x

1

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

আমি যে কার্যকারিতাটি ব্যবহার করি তা হ'ল দুটি স্মৃতির একটিতে একটি পতাকা যুক্ত করা যা প্রত্যাবর্তন লেবেল নির্বাচন করতে ব্যবহৃত হয়। এটি সর্বোত্তম কাজ করে যখন ফাংশন কোডটিতে কেবল একটি একক মেমরি স্পেস প্রয়োজন (অন্যটি)।

উদাহরণস্বরূপ আমি কী বলতে চাইছি তা দেখানো: আমার একটি প্রকল্প থেকে সেডে একটি ছোট খেলা লেখার জন্য নেওয়া

# after applying the player's move, I overwrite the pattern space with the flag "P"
s/.*/P/
b check_game_status
:continue_turn_from_player
#code

b calculate_bot_move
:return_bot_move
# here I call the same function 'check_game_status', but with a different flag: "B"
s/.*/B/
b check_game_status
:continue_turn_from_bot
#code (like say 'b update_screen')

:check_game_status   # this needs just the hold space to run
#code
/^P$/b continue_turn_from_player
/^B$/b continue_turn_from_bot

লেবেলগুলি অবশ্যই কেবল একটি চিঠিতে গল্ফ করা উচিত, আমি আরও ভাল ব্যাখ্যার জন্য পুরো নাম ব্যবহার করেছি।


1

খালি রেজিক্সগুলি পূর্বের সম্মুখীন হওয়া রেজেক্সের সমতুল্য

(ধন্যবাদ রিলে একটি থেকে এই আবিষ্কার জন্য anagol জমা )

এখানে একটি উদাহরণ যেখানে @খালি বাফারে 100 টি তৈরি করার কাজ আমাদেরকে দেওয়া হয় ।

s/$/@@@@@@@@@@/;s/.*/&&&&&&&&&&/ # 31 bytes
s/.*/@@@@@@@@@@/;s//&&&&&&&&&&/  # 30 bytes

দ্বিতীয় সমাধানটি হ'ল 1 বাইট সংক্ষিপ্ত এবং এই সত্যটি ব্যবহার করে যে খালি রেজিক্সগুলি শেষ মুখোমুখি হওয়া রেজিক্সের সাথে পূর্ণ হয়েছে। এখানে, দ্বিতীয় প্রতিস্থাপনের জন্য, সর্বশেষ রেজেক্স ছিল.* , সুতরাং এখানে খালি রেজেক্স ভরাট হবে .*। এটি ইন রেজিক্সগুলির সাথেও কাজ করে /conditionals/

মনে রাখবেন এটি পূর্বের মুখোমুখি রেজেক্স, সুতরাং নিম্নলিখিতগুলিও কাজ করবে।

s/.*/@@@@@@@@@@/;/@*/!s/$/@/;s//&&&&&&&&&&/

খালি রেজেক্স @*পরিবর্তে পূর্ণ হয়ে যায় $কারণ s/$/@/কখনই পৌঁছায় না।


হ্যাঁ, ভাল উত্তর। এমনকি আমি আরও দীর্ঘসূত্রগুলি তৈরি করেছি যাতে এগুলি পুনরায় মিলে যায় (এভাবে প্রোগ্রামটি সংক্ষিপ্ত করে তোলা হবে)।
টবি স্পিড

0

বেশিরভাগই অকেজো পদক্ষেপ:

y|A-y|B-z|

এটি কেবলমাত্র অনুবাদ করবে Aকরার Bএবং yকরতে z(... এবং -করার -;) তাই হয়, কিন্তু অন্য কিছুই

sed -e 'y|A-y|B-z|' <<<'Hello world!'

শুধু ফিরে আসবে:

Hello world!

আপনি নিশ্চিত করতে পারে এই ছোট হাতের হেক্সাডেসিমেল মান এই ব্যবহার করে বেহুদা হবে নমুনা জন্য (শুধুমাত্র ধারণকারী 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, eবা f।)


2
এটি কি এমন কিছু যা আপনি হার্ড পথ খুঁজে পেয়েছেন ?! ;-)
টবি স্পিড

আমি অকেজো স্ক্রিপ্টগুলি পছন্দ করি: sed '; ;/s/b;y|A-y|B-z|;s ;s/ //; ; ;' <<<'Hello world'(কেন এটি স্থানটি দমন করে না ?)
এফ হাউরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.