কমান্ড প্রতিস্থাপনের পরিবর্তনশীল প্রতিস্থাপনে বাসা বাঁধতে পারে?


10

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

$ xclip -o -selection clipboard
Here's a string I just copied.

যদি আমি এটিকে কোনও ভেরিয়েবলের জন্য নির্ধারণ করি, তবে আমি এটিতে পরিবর্তনশীল বিকল্প করতে পারি।

$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.

তবে, ভেরিয়েবলকে বরাদ্দ না করে কি ভেরিয়েবল প্রতিস্থাপনের কোনও উপায় আছে? ধারণাগতভাবে, এই জাতীয় কিছু।

$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution

এই বাক্য গঠনটি ব্যর্থ হয়, কারণ varএকটি পরিবর্তনশীল নাম হওয়া উচিত, স্ট্রিং নয়।

উত্তর:


6

না, আপনি পারবেন না। bashএবং অন্যান্য বেশিরভাগ শেল (বাদে zsh) নেস্টেড প্রতিস্থাপনের অনুমতি দেয় না।

এর সাথে zsh, আপনি নেস্টেড প্রতিস্থাপন করতে পারেন :

$ echo ${$(echo 123)/123/456}   
456

আমি এই উত্তরটি গ্রহণ করব, যেহেতু এটি এমন কিছু পরিস্থিতি প্রমাণ দেয় যা এটি সম্ভব নয় bash। (এবং আমাকে আবার স্থানান্তরিত করার দিকে ধাক্কা দেয় zsh))
স্পারহক

2

হ্যাঁ, আপনি এটি করতে পারেন - ধরনের। এটা সত্যিই সুন্দর না। এটি নেস্টেডের চেয়ে বেশি লাইনের মতো । সমস্যাটি হ'ল আপনার প্রসারিত প্যারামিটারটির মানটি পরিচালনা করতে হবে - যদি সেই প্যারামিটারটির কোনও মান না থাকে তবে আপনি বেশি কিছু করতে পারবেন না। সুতরাং, আপনি প্রসারিত করার সময় মান নির্ধারণ করতে পারেন এবং এটি খুব কমই একটি শর্টকাট।

v=; echo "${v:=${0##*["$0${v:=$(xsel -bo)}"]}${v/copi/knott}}"

অ্যাসাইনমেন্টটি লুকানোর জন্য আমি $0শৃঙ্খলের মধ্যে পরম বর্ধন ব্যবহার করি । এটি নেস্টেড অ্যাসাইনমেন্ট প্রসারণের মধ্যে ভের মান নির্ধারণ করে। বাহ্যিক অগ্রাধিকার গ্রহণ করে - তবে কারণ এটি কেবল অভ্যন্তরের যা কিছু করে তা প্রসারিত হবে তা বলা শক্ত। তবে, আমরা যদি অভ্যন্তরীণ প্রসারকে নিরব করে রাখি, তবে এটি পরিবর্তন করুন আপনি যা চান তা পেতে পারেন। আপনার স্ট্রিংটি আমার ক্লিপবোর্ডে অনুলিপি করার পরে (আমার কাছে নেই - কেবল ) এটি মুদ্রণ করে:xclipxsel

Here's a string I just knotted.

আপনি যদি ছেড়ে $0যান তবে কী চলছে তা এটি আরও পরিষ্কার cle

v=; echo "${v:=${v:=$(xsel -bo)}${v/copi/knott}}"

যে মুদ্রণ:

Here's a string I just copied.  Here's a string I just knotted.

... কারণ অভ্যন্তরীণ অ্যাসাইনমেন্টটি সংশোধন করার আগে ঘটেছিল, তবে যেমনটি উল্লেখ করা হয়েছে, বাহ্যিক অ্যাসাইনমেন্টটি অগ্রাধিকার নেয় - এবং এটি অভ্যন্তরীণ-অ্যাসাইনমেন্টের সম্প্রসারণ এবং পরিবর্তিত অভ্যন্তরীণ-প্রসারণ উভয়তেই প্রসারিত হয় ।

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


কার্যবিধির জন্য +1, যদিও আপনি বলেছেন যে এটি একটি কর্মচক্র যা সম্ভবত ভেরিয়েবল নির্ধারণের চেয়ে খারাপ!
স্পারহক

@ স্পারহাক - হ্যাঁ, অবশ্যই আরও খারাপ। এবং ডব্লিউ / এ যাইহোক সত্যিই কিছুই নেই - অনিশ্চয়তা ছাড়া আর লাভ করার মতো কিছুই নেই। aliasএটিকে কিছুটা সুবিধাজনক করার জন্য আপনি কিছু দিকনির্দেশনা নিয়ে আসতে পারেন - তবে এটি যদি আপনার পক্ষে মূল্য হয় তবে আপনার নিরাপদ-উদ্ধৃতি পরিচালনা করতে এবং ডাব্লু / evalবা এর মতো কিছু করার জন্য একটি ফাংশন সেটআপ করা উচিত । ডাব্লু / eval- আপনি যদি কমান্ড সাব এর আউটপুট পরিমাণের প্রথম অক্ষরগুলি কার্যক্ষম এক্সপেনশন সিনট্যাক্সে করতে পারেন - তবে আপনি সম্ভবত আরও অনেক সহজ পেতে পারেন। আমি জানি যে এ জাতীয় জিনিস সহজ হবে W / xsel- এটি স্টিডিন লাগে - তবে xsel?
মাইকসার্ভ

@ স্পারহাক - আমি কেবল জানি যে এর মাধ্যমে কীভাবে কীভাবে করা যায়, কারণ কিছু পরিস্থিতিতে এটি কার্যকর হতে পারে - যেমন প্রম্পট বা এখানে-ডক এক্সপেনশনস - যাতে আপনি অন্যথায় প্রয়োগের জন্য বর্তমান শেল অ্যাসাইনমেন্টটি পেতে পারেন না।
মাইকসার্ভ

1

আপনি যদি এএ ভেরিয়েবল তৈরি করতে না চান তবে স্ট্রিং প্রতিস্থাপন সম্পাদন করার অন্যান্য উপায় রয়েছে:

$ echo $(xclip -o -selection clipboard | sed 's/copi/knott/')
Here's a string I just knotted.

ধন্যবাদ, আমি জানতাম যে sedপরিবর্তে আমি এটি ব্যবহার করতে পারি , তবে এটি বিকল্প হিসাবে বাসা বাঁধার বিষয়ে একটি সাধারণ প্রশ্ন ছিল।
স্পারহক

@ স্পারহাক আমার জ্ঞানের মতে, কেউ পরিবর্তনশীল না করে পরিবর্তনীয় প্রতিস্থাপন করতে পারে না।
1024

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

পছন্দ করুন
1024

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