পাইপিং বাশ স্ট্রিং ম্যানিপুলেশন


9

আমি অন্য কিছু পাইপিং ব্যাশ স্ট্রিংয়ের ম্যানিপুলেশন প্রশ্নগুলি পড়েছি তবে সেগুলি বিশেষায়িত অ্যাপ্লিকেশন বলে মনে হচ্ছে।

মূলত, নীচের আরও সহজ করার উপায় আছে?

পরিবর্তে

$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD

কিছুটা এইরকম

$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD

সম্পাদনা আমি গতি বজায় রাখা সম্ভব হলে বাশ হেরফেরের মধ্যে থাকতে আগ্রহী (আমার স্ক্রিপ্টগুলিকে ধীরে ধীরে কমিয়ে দেওয়ার প্রবণতা যেমন শেড / অ্যাজকের বিপরীতে)

সম্পাদনা 2: @ জিম্মিজ

আমি দ্বিতীয় উদাহরণটি পছন্দ করি এবং আমাকে একটি ফাংশন তৈরি করতে পরিচালিত করি।

bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD

1
কেন আপনি ভাবেন যে এই উদ্দেশ্যে স্যাড / অ্যাজক ধীর হবে? তারা যত দ্রুত আসে তত দ্রুত।
এমকেসি

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

2
@ jw013 প্রশ্ন থেকে "হ্যালো ওয়ার্ল্ড" হিসাবে সংক্ষিপ্ত স্ট্রিংয়ের ক্ষেত্রে এটি সত্য, তবে স্ট্রিংটি যদি খুব দীর্ঘ হয় তবে trম্যানুয়ালটি বলুন , তবে বিপরীতটি সত্য কারণ প্রক্রিয়াগুলিকে স্প্যান করার সময়টি স্ট্রিং ম্যানিপুলেশনের সময়ের সাথে তুলনায় নগণ্য which sedএবং awkউত্সর্গীকৃত। যদি স্ট্রিংটি অত্যন্ত দীর্ঘ হয় তবে পুরো ব্যাশ ম্যানুয়ালটি বলুন, তবে অভ্যন্তরীণ কিছু সীমাবদ্ধতার কারণে ব্যাশ কেবল পুরোপুরি এগিয়ে যেতে অস্বীকার করতে পারে।
জিম্মিজ

2
@ jw013 আমি যে ব্যাশ এর স্ট্রিং ম্যানিপুলেশন কোড দাবি করছি যেমন কম দক্ষ তারপর নিবেদিত টুলস sed, awk, trবা অনুরূপ। জেনা 2 এক্স উত্তরটি দেখুন, যা আমি কিছুক্ষণ আগে সম্পাদনা করেছি ঠিক এই তথ্যটি যুক্ত করে: unix.stackexchange.com/questions/162221/… আপনি এটি একই প্রশ্নের টেরডন উত্তরের সাথে তুলনা করতে চাইতে পারেন যেখানে তিনি সংক্ষিপ্ত স্ট্রিংয়ের জন্য সময় দেন যেখানে কেস প্রক্রিয়া spawning সবচেয়ে বেশি সময় নেয়। আপনি নিজে এটি পরীক্ষা করতে পারেন এবং ফলাফল পোস্ট করতে পারেন।
জিম্মিজ

1
@ মিয়াতি আপনি কী ভাবেন যে এই অতিরিক্ত read x; echo $xকোনও পারফরম্যান্সের চেয়ে ভাল? সিনট্যাক্সটি কোনও খাটো বা ক্লিনার দেখায় না। x=${x// /_}; x=${x^^}অনেক সংক্ষিপ্ত উপায় হিসেবে একই জিনিস করতে হয় {read x; echo ${x...। পারফরম্যান্স যতদূর যায়, @ জিম্মিজ উল্লেখ করেছেন যে tr/ থেকে sedআরও দ্রুত হবে bashকাঁটা সংখ্যা সমান। পাইপ ব্যবহারের ফলে সর্বদা অতিরিক্ত প্রক্রিয়া হয় যার ফলে কাঁটাচামচ সংরক্ষণের যুক্তি আর প্রয়োগ হয় না। সুতরাং, যদি পাইপ ব্যবহার করা হয় তবে কেবল sed/ trইত্যাদি ব্যবহার করুন যদি আপনি এটি ব্যাশে করতে পারেন তবে এটি করুন এবং এই read x; echo $xবাজে কথা এড়িয়ে যান ।
jw013

উত্তর:


9

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

এখানে সেই থিমটির একটি বৈকল্পিক:

echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})

আমি ব্যবহার করতে ঝোঁক হবে tr, কারণ এটি বেশ দ্রুত।

echo 'hello world'|tr ' [:lower:]' '_[:upper:]'

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


7

আপনি এইভাবে প্যারামিটার বিস্তৃতি পাস করতে পারবেন না। আপনি যখন ফর্ম হিসাবে প্রতীক xব্যবহারের উল্লেখ করেন , তখন এটির আসল পরিবর্তনশীল নাম থাকতে হবে, কোনও স্ট্যান্ডার্ড ইনপুট নয়, অন্তত অন্তর্ভুক্ত নয় । ইন আপনি নিম্নলিখিত ভাবে নেস্টেড প্যারামিটার বদল সম্পাদন করতে পারবেন:$"${x}"bashzsh

$ x=''hello world'
$ echo ${${x// /_}:u}
HELLO_WORLD

(দ্রষ্টব্য: :uজন্য zshহিসাবে একই ^^জন্য bash)

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

$ echo 'hello world' | { read x; echo "${x// /_}"; } | { read y; echo "${y^^}"; }
HELLO_WORLD

1
স্ট্রিং প্রসেসিংয়ের তুলনায় কীভাবে tr/ sedআরও দ্রুত bash, এবং স্ট্যান্ডার্ড I / O এর মাধ্যমে স্ট্রিংগুলি পাস করার জন্য আপনি কীভাবে পাইপ ব্যবহার করছেন সে সম্পর্কে আমাদের সাম্প্রতিক কথোপকথনের কথা বিবেচনা করে, আমি tr/ এর বিপরীতে বাশগুলিতে সেই অপারেশনগুলি করার আক্ষরিক শূন্য পয়েন্ট দেখতে পাচ্ছি sed। কেন কেউ কখনও একই জিনিসটির | { read x; echo $x... }বিরোধিতা করবে | sed?
jw013

1
@ jw013 খোলামেলা কথা বলতে আমি দেখি কোন লাভ নেই। এটা ঠিক একটি উদাহরণ জোর সমস্যার পাইপ ব্যস্ত, কারণ ওপি স্পষ্টভাবে (উভয় তাদের জন্য জিজ্ঞাসা এবং বহিরাগত প্রোগ্রাম ব্যবহার করতে চান না echoএবং readএকটি সামান্য বিট আরও দ্রুত ব্যাশ বিল্ট-ইন আছে, নীতিগতভাবে তাই)। আমি ইতিমধ্যে উত্তরটিতে প্রগতিশীল পরামিতি ম্যানিপুলেশনগুলিতে লিখেছি যে প্রশ্নে ওপির কাছে প্রশ্নটি এই কাজটির জন্য আমার মতামতটি সবচেয়ে ভাল পেতে পারে। যাইহোক সমস্যা বরং একাডেমিক।
jimmij
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.