'সেড' যুক্ত করুন


40

আমি এর সাথে একটি গাণিতিক অপারেশন করার চেষ্টা করছি sed, তবে এটি আমার ভেরিয়েবলগুলিকে স্ট্রিং হিসাবে বিবেচনা করে চলেছে। ইনপুট এই ধরণের হয়:

$ echo 12 | sed 's/[0-9]*/&+3/'
$ 12+3

আমি আউটপুট হিসাবে 15 করতে চান। আমাকে অপারেশনটি করতে হবে এবং এর গাণিতিক ফলাফলটি কেবল একটি উত্তরণে প্রতিস্থাপন করা দরকার, কারণ আমি প্রোগ্রামটি পাইথন ডেমন হিসাবে চালাচ্ছি এবং আমি stdoutফাইলগুলিতে পুনঃনির্দেশকরণ , সেই ফাইলগুলি খুলতে, অপারেশন করা, ফলাফলটি বের করতে, ফলাফলগুলি বের করার মতো প্যাসেজগুলি এড়াতে চাই প্রতিস্থাপন. আমার কাছে, sedএক লাইনে সমস্ত সম্পাদন করা ভাল বলে মনে হচ্ছে।

আমি বিভিন্নভাবে ইনপুট এবং আউটপুট উভয়ই কাস্ট করার চেষ্টা করেছি

$ echo 12 | sed 's/[0-9]*/int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'

তবে ফলাফলটি সর্বদা দ্বিতীয় ক্ষেত্রের একটি মুদ্রণ ছিল।


12
এটি আপনার "ভেরিয়েবলগুলি" কে স্ট্রিং হিসাবে চিকিত্সা করছে কারণ এগুলি সবই হয় - স্ট্রিং ম্যানিপুলেশন। এটিতে "পূর্ণসংখ্যার" ধারণা নেই।
কেভিন

2
আপনি কেন sedগণিত করতে ব্যবহার করতে চান তা সম্পর্কে আমি খুব কৌতূহলী
ডেভিড ওনিল

আমি কেবল ভেবেছিলাম এটি সহজেই ভেরিয়েবল নিক্ষেপ করতে পারে, বুঝতে পারিনি এত জটিল!
লুইজি তিবুরজি

উত্তর:


82

আপনি যদি সত্যই সেড ব্যবহার করতে চান তবে এই উপায়:

s/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/+//g
: minus
s/|-|/-/g
t minus
s/-$//
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back

ইনপুট:

1+2
100+250
100-250

আউটপুট:

3
350
-150

আপনার মিশনটি, আপনি যদি এটি গ্রহণ করা পছন্দ করেন তবে তা হ'ল গুণকে বাস্তবায়ন করা।


5
চ্যালেঞ্জের জন্য +1, এটি ভালবাসেন! সম্ভবত এটি কোড গল্ফ ;
হিউসার

6
এবং কিছু লোক বলেছেন যে প্রোগ্রামিং গণিত নয়। এই ছোট্ট মণি তাদের সকলকে খণ্ডন করে। বেস 1 সর্বকালের সেরা ব্যবহার।
ব্রুস এডিগার

1
সুন্দর! - @ সিমন: আমি আপনাকে টিটারেশন প্রয়োগের জন্য চ্যালেঞ্জ জানাই : পি
এটি

16
+1 সৃজনশীলতার সাথে যুক্ত ভুল ধারণাটি কীভাবে প্রজনন করতে পারে তার এটি একটি সুন্দর উদাহরণ।
রোজিট্রিজেভিয়াকজ

1
সেড দিয়ে গুণ করা যায় - এবং এটি বিশাল পরিমাণে খুব ভাল পরিমাণে স্কেল করে!
টবি স্পিড

20

sedএখানে সেরা বিকল্প নয়, এটি পাটিগণিতগুলি স্থানীয়ভাবে করেন না ( আপনি সম্ভবত এটি কীভাবে করতে পারেন তার জন্য একটি সংখ্যা বৃদ্ধি দেখুন )। আপনি এটি দিয়ে এটি করতে পারেন awk:

$ echo 12 | awk '{print $0+3}'
15

ব্যবহারের জন্য সর্বোত্তম কোডের অংশটি আপনার ইনপুটটির সঠিক ফর্ম্যাট এবং যদি আপনি সংখ্যাটি না করে বা কী করতে চান তবে তার উপর নির্ভর করবে বা এতে একাধিক নম্বর রয়েছে ইত্যাদি will

আপনি কেবল এটি দিয়ে এটি করতে পারেন bash:

$ echo $(( $(echo 12) + 3 ))

বা exprঅনুরূপ ফ্যাশন ব্যবহার করে ।


17

আমি আপনার রিচটারটিকে আপনার চ্যালেঞ্জটি গ্রহণ করার চেষ্টা করেছি, আমি আপনার কোডের কিছু অংশ ব্যবহার করে এটি করেছি:

sed 's/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/.*\*$/0/
s/^\*.*/0/
s/*|/*/
: mult
s/\(|*\)\*|/\1<\1*/ 
t mult
s/*//g
s/<//g
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back'

ইনপুট:

04*3
4*3
40*3
42*32
150*20
1*3
3*1
0*3
3*0

আউটপুট: সমস্ত সঠিক ফলাফল


@ সিমোনরিচটার আশা করি আপনি উপভোগ করবেন !!
লুইজি তিবুরজি

ক্রস এই উজ্জ্বল উত্তরটি এখানে পোস্ট করেছেন: কোডগলফ.স্ট্যাকেক্সচেঞ্জ
ডিজিটাল ট্রমা

12

perlএর সাথে খুব অনুরূপ নির্মাণের অনুমতি দেয় sed... একটি পার্থক্য হ'ল perlআরও জটিল জিনিসগুলি করা যায় ... sedসাধারণ পাঠ্য সংস্থার পক্ষে খুব ভাল

 echo 'a12' | perl -pe 's/([0-9]+)/($1+3)/e'  # the trailing /e means evaluate

আউটপুট

a15

2
ক্যাপচারিং বন্ধনীগুলি ছাড়াও এটি করতে পারেন:perl -pe 's/[0-9]+/$&+3/e'
গ্লেন জ্যাকম্যান


6

নীচের যে কোনও গ্রহণযোগ্য উত্তরটির চরম জটিলতা কেন আপনি চান তা আমি সত্যিই পাই না:

echo 12 | sed 's/[0-9]*/echo \$(( & + 3 ))/e'

অথবা

echo 12 | sed 's/[0-9]*/expr & + 3/e'

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


এটি একটি gnu এক্সটেনশন।
কেভিন

ঠিক আছে আপনি ঠিক বলেছেন তবে উত্তরটি ছাড়িয়ে গেছে, এটি সাধারণ
সংযোজনকে নির্দিষ্ট করে তোলে

@ লুইগিটিবুরজি একে একে "এক্স + ওয়াই" স্টাইলের ইনপুটটিতে সাধারণীকরণ করা মোটামুটি সোজা:echo 12+3 | sed -r 's/([0-9]*) *\+ *([0-9]*)/expr \1 + \2/e'
ডিজিটাল ট্রমা

5

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

পার্ল, রুবি, জাভাস্ক্রিপ্ট এবং পাইথন এই জাতীয় ভাষা:

bash-4.2$ echo 12 | perl -pe 's/\d+/$&+3/e'
15

bash-4.2$ echo 12 | ruby -pe '$_.sub!(/\d+/){|s|s.to_i+3}'
15

bash-4.2$ echo 12 | js -e 'print(readline().replace(/\d+/,function(s){return parseInt(s)+3}))'
15

bash-4.2$ echo 12 | python -c 'import re;print re.sub("\d+",lambda s:str(int(s.group(0))+3),raw_input())'
15

1

আর একটি সহজ bashসমাধান, যা আসলে পাইপে কাজ করে:

 echo 12 | { read num; echo $(( num + 3)); }

1

আপনি যদি কিছু বাশিজমে মিশ্রিত হন:

echo $(($(echo 12 | sed 's/[0-9]*/&+3/')))

কোনও পাঠ্য থেকে নম্বরটি বের করতে:

echo $(($(echo "foo12bar" | sed -r 's/[^0-9]*([0-9]*).*/\1+3/')))

সেড ছাড়া, কেবল বাশ:

var="foo12bar"
echo $((${var//[^0-9]/}+3))

প্রতিটি অ-অঙ্কের প্রতিস্থাপন করে ${var//[^0-9]/}এবং ডাবল রাউন্ড প্যারেনগুলিতে পাটিগণিত করেন:$((x+3))


2
সেখানে কোনও বাশিজম নেই। $((...))POSIX (বাশিজম হয় $[...]) দ্বারা পরিচয় করিয়ে দেওয়া হয়েছিল । ${var//xxx/x}zsh এবং বাশ দ্বারা অনুলিপি করা একটি kshism হয়। sed -rএকটি জিএনইউজম
স্টাফেন চেজেলাস

0

এখানে একটি পার্ল সমাধান:

echo 12 | perl -wlpe '$_ += 3'
# Output:  15

আপনি যদি স্ট্রিংয়ের সাথে সম্মুখীন অঙ্কগুলির প্রথম সেটটি পরিবর্তন করতে পছন্দ করেন তবে আপনি এটি ব্যবহার করতে পারেন:

echo I am 12 years old. | perl -wlpe 's/(\d+)/$1 + 3/e'
# Output:  I am 15 years old.

আপনি যদি স্ট্রিংয়ে অঙ্কের সমস্ত সেট পরিবর্তন করতে পছন্দ করেন তবে আপনি /gএই জাতীয় সংশোধক ব্যবহার করতে পারেন :

echo They are 11, 12, and 13 years old. | perl -wlpe 's/(\d+)/$1 + 3/eg'
# Output:  They are 14, 15, and 16 years old.

0

যদিও সেড এক্সপ্রেশন ব্যবহার দুর্দান্ত তবে এর সীমাবদ্ধতা রয়েছে। উদাহরণস্বরূপ নিম্নলিখিত ব্যর্থতা:

$ echo "1000000000000000000000000000000+1" | sed -e 's/\([0-9]*\)+\([0-9]*\)/expr \1 + \2/e'
expr: 1000000000000000000000000000000: Numerical result out of range

এই সীমাবদ্ধতা কাটিয়ে উঠতে আমার খালি খাঁটি সেডের শক্তিতে নির্মিত এবং নিম্নলিখিত স্বেচ্ছা দৈর্ঘ্য দশমিক সংযোজকটিকে বাস্তবায়িত করুন:

#! / বিন / সেড -f

S / + + / \ N / ছ
S / $ / \ n \ n N0 /

:লুপ
S / ^ \ (। * \) \ (। \) \ n \ n (। * \) \ (। \) \ n \ n (। * \) \ n \ n (। \) $ / 0 \ 1 \ N0 \ 3 \ n \ n 5 \ n \ n 6 \ 2 \ 4 /
জ
গুলি /^.* \ N। * \ N। * \ n \ n (... \) $ / \ 1 /

# দশমিক পূর্ণ সংযোজন মডিউল
# ইনপুট: 3 ডিজিটস (ক্যারি ইন, এ, বি,)
# আউটপুট: 2 বিটস (ক্যারি, সম)
S / $ /;000 = 00001 = 01002 = 02003 = 03004 = 04005 = 05006 = 06007 = 07008 = 08009 = 09010 = 01011 = 02012 = 03013 = 04014 = 05015 = 06016 = 07017 = 08018 = 09019 = 10020 = 02021 = 03022 = 04023 = 05024 = 06025 = 07026 = 08027 = 09028 = 10029 = 11030 = 03031 = 04032 = 05033 = 06034 = 07035 = 08036 = 09037 = 10038 = 11039 = 12040 = 04041 = 05042 = 06043 = 07044 = 08045 = 09046 = 10047 = 11048 = 12049 = 13050 = 05051 = 06052 = 07053 = 08054 = 09055 = 10056 = 11057 = 12058 = 13059 = 14060 = 06061 = 07062 = 08063 = 09064 = 10065 = 11066 = 12067 = 13068 = 14069 = 15070 = 07071 = 08072 = 09073 = 10074 = 11075 = 12076 = 13077 = 14078 = 15079 = 16080 = 08081 = 09082 = 10083 = 11084 = 12085 = 13086 = 14087 = 15088 = 16089 = 17090 = 09091 = 10092 = 11093 = 12094 = 13095 = 14096 = 15097 = 16098 = 17099 = 18100 = 01101 = 02102 = 03103 = 04104 = 05105 = 06106 = 07107 = 08108 = 09109 = 10110 = 02111 = 03112 = 04113 = 05114 = 06115 = 07116 = 08117 = 09118 = 10119 = 11120 = 03121 = 04122 = 05123 = 06124 = 07125 = 08126 = 09127 = 10128 = 11129 = 12130 = 04131 = 05132 = 06133 = 07134 = 08135 = 09136 = 10137 = 11138 = 12139 = 13140 = 05141 = 06142 = 07143 = 08144 = 09145 = 10146 = 11147 = 12148 = 13149 = 14150 = 06151 = 07152 = 08153 = 09154 = 10155 = 11156 = 12157 = 13158 = 14159 = 15160 = 07161 = 08162 = 09163 = 10164 = 11165 = 12166 = 13167 = 14168 = 15169 = 16170 = 08171 = 09172 = 10173 = 11174 = 12175 = 13176 = 14177 = 15178 = 16179 = 17180 = 09181 = 10182 = 11183 = 12184 = 13185 = 14186 = 15187 = 16188 = 17189 = 18190 = 10191 = 11192 = 12193 = 13194 = 14195 = 15196 = 16197 = 17198 = 18199 = 19 /
S / ^ \ (... \) [^;] * [^;]। * \ 1 = \ (.. \) * / \ 2 /
এইচ
ছ
S / ^ \ (। * \) \ n \ n (। * \) \ n \ n (। * \ নেই) \ n ... \ n \ n (। \) \ (। \) $ / \ 1 \ n \ n 2 \ n \ n 5 \ 3 \ n \ n 4 /
/ ^ \ ([0] * \) \ n \ ([0] * \) \ n /
        গুলি /^.* \ N। * \ n \ n (। * \) \ n \ n (। \) / \ 2 \ 1 /
        S / ^ 0 \ (। * \) / \ 1 /
        কুই
}
বি লুপ

এটি যেভাবে কাজ করে তা হ'ল দশমিক সংযোজনকারী মডিউল প্রয়োগ করে যা দুটি ইনপুট ডিজিট (A এবং B) পাশাপাশি ক্যারি বিট যুক্ত করে এবং একটি যোগফল এবং ক্যারি বিট তৈরি করে। ধারণাটি বৈদ্যুতিন থেকে ধার করা হয়েছে যেখানে বাইনারি সংযোজক বাইনারি সংখ্যার জন্য একই কাজ করে। আমাদের যা করতে হবে তা হ'ল সমস্ত সংখ্যার উপরে সংযোজকটিকে লুপ করতে হবে এবং আমরা নির্বিচারে দৈর্ঘ্যের সংখ্যাগুলি (মেমরি দ্বারা সীমাবদ্ধ) যুক্ত করতে পারি। নীচে কর্মে সংযোজনকারী:

./decAdder.sed
666666666666666666666666666666999999999999991111111112222+1100000000000000000000011111111111111111111111111111111111
1766666666666666666666677777778111111111111102222222223333

ঠিক ঠিক একইভাবে কেউ বাইনারি (বা অন্য কোনও বেস) অ্যাডারের প্রয়োগ করতে পারে। আপনাকে যা করতে হবে তা হ'ল লাইনটি প্রতিস্থাপন যা s/$/;000=00001...প্রদত্ত বেসের জন্য যথাযথ প্রতিস্থাপনের প্যাটার্ন দিয়ে শুরু হয় । উদাহরণস্বরূপ: s/$/;000=00001=01010=01011=10100=01101=10110=10111=11/ স্বেচ্ছাসেবী দৈর্ঘ্যের বাইনারি অ্যাডারের বিকল্প প্রতিস্থাপন।

আপনি আমার গিথুবে নথিভুক্ত কোডটি ফিট করতে পারেন ।

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