কমান্ড লাইনের মাধ্যমে বিশ্রী ভার্সার সেট করার 2 উপায় আছে?


10

আমি একটি ও'রিলি awkউদাহরণ লক্ষ্য করেছি (1997) যা প্রোগ্রাম-টেক্সটের পরে কমান্ড লাইনে সেট করে একটি awk ভেরিয়েবল নির্ধারণ করে । এটি কাজ করে, তবে আমি এই সিনট্যাক্সটি ম্যান / ইনফো তে খুঁজে পাই না । আমি কি শুধু এটি মিস করেছি; এটা কি চিত্রিত হয় ...? আমি ম্যানুয়ালটিতে একমাত্র সিনট্যাক্সটি দেখেছি -v

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

আউটপুট: cat dog

উত্তর:


11

এটি আসলে পসিক্সে awk(পোসিক্স ২০০ 2008 এর লিঙ্ক, পূর্ববর্তী সংস্করণগুলিতে এটি আমারও বিশ্বাস ছিল)। অপশন বিভাগে -vবর্ণিত হয়েছে , অন্য উপায়টি অপেরাড বিভাগে রয়েছে।

-vফাইলের নামের সাথে অ্যাসাইনমেন্টগুলি পাস করার মধ্যে পার্থক্য রয়েছে :

  • সহ -v:

অ্যাপ্লিকেশনটি নিশ্চিত করবে যে কার্যনির্বাহ যুক্তি একটি অ্যাসাইনমেন্ট অপারেন্ড হিসাবে একই ফর্মের মধ্যে রয়েছে। নির্দিষ্ট ভেরিয়েবল অ্যাসাইনমেন্টটি বিজিআইএন প্যাটার্নগুলির সাথে যুক্ত ক্রিয়াসমূহ (যদি থাকে) সহ অ্যাডাব্লু প্রোগ্রামটি কার্যকর করার আগে ঘটবে । এই বিকল্পের একাধিক ঘটনা উল্লেখ করা যেতে পারে।

  • ফাইলের নামের সাথে মিশ্রিত:

[...] এই ধরণের প্রতিটি পরিবর্তনীয় অ্যাসাইনমেন্ট নীচের ফাইলটি প্রসেসিংয়ের ঠিক আগে ঘটেছিল , যদি কোনও হয়। সুতরাং, প্রথম ফাইল আর্গুমেন্টের আগে একটি অ্যাসাইনমেন্টটি বিগইএন ক্রিয়াগুলির পরে কার্যকর করা হবে (যদি থাকে) তবে শেষ ফাইল আর্গুমেন্টের পরে একটি অ্যাসাইনমেন্ট শেষ ক্রিয়াগুলির (যদি থাকে) এর আগে উপস্থিত হবে। যদি কোনও ফাইল আর্গুমেন্ট না থাকে তবে স্ট্যান্ডার্ড ইনপুট প্রক্রিয়া করার আগে অ্যাসাইনমেন্টগুলি কার্যকর করা হবে।

উদাহরণ:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

কি দারুন! এটি কিছু আকর্ষণীয় নিয়ন্ত্রণ পয়েন্ট যুক্ত করে ... এটি কার্যকর হতে বাধ্য। ধন্যবাদ ...
পিটার.ও

1
আমার প্রাথমিক "বাহ!" এখনও ধরে আছে, তবে এটি আর্জেজের উত্তরটি আরও খুঁটিয়ে দেখে কিছুটা স্বাচ্ছন্দ্য বোধ করেছে ... আমি এটি "ভার = তিন" নামে একটি আসল ফাইল দিয়ে পরীক্ষা করেছি ... awkএটি একটি পরিবর্তনশীল অ্যাসাইনমেন্ট হওয়ার চেয়ে অগ্রাধিকার দিয়েছে ... এটির একটি প্রধান প্রতিচ্ছবি রয়েছে অর্থাৎ। ইন সব ক্ষেত্রে যখন একটি ফাইলের নাম এই ফর্মটি আছে, এটা উপেক্ষা করা হবে এবং পরিবর্তনশীল নির্ধারণ করা হবে ... মনে হচ্ছে যে একমাত্র উপায় এই সংঘর্ষ এড়াতে সাম্প্রতিক কাজ করা জন্য নিশ্চিত ফাইল-নাম দ্বারা হয় সবসময় আবশ্যক পূর্বে সমাধান করা তাদের আপেক্ষিক পথ সহ:./var=three
পিটার.ও

@ পিটার.ও, হ্যাঁ, -vসিনট্যাক্সটি চালু করার কারণগুলির মধ্যে এটিও । আপনার -vবাক্য গঠনটি অ্যাসাইনমেন্টগুলি করার জন্য পছন্দসই উপায় হিসাবে এগিয়ে যেতে হবে think
সন্দেহভাজন জিম

@ পিটার.ও, " গোটচা " সম্পর্কে দুর্দান্ত পয়েন্ট যদি কোনও ফাইল নাম বৈধ পরিবর্তনশীল অ্যাসাইনমেন্ট হয়। আপনি যদি একটি শেল পরিবর্তনশীল ব্যবহার করছেন একটি ফাইল ধারণকারী ও ক্ষণস্থায়ী যে একটি আর্গুমেন্ট হিসেবে awk, আপনি নিম্নলিখিত ধরা ব্যবহার করতে পারে:[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
ওয়াইল্ডকার্ড

4

এটি বহিরাগতভাবে ভেরিয়েবলগুলি সেট করার একটি পুরানো স্টাইল awk। এটি অস্পষ্ট ছিল (যদি আপনার কোনও ফাইলের নাম দেওয়া থাকে তবে কী foo=cat) তাই পরবর্তী সংস্করণগুলিতে একটি -vবিকল্প যুক্ত হয়েছিল। এটি সম্ভবত পিছিয়ে-সামঞ্জস্যের জন্য কাজ করা উচিত তবে আপনি গ্যারান্টি দিতে পারবেন না। এবং আমি যেমন বলেছি, -vবিকল্পটি আরও নতুন, সুতরাং সমস্ত সংস্করণ awkএটি সমর্থন করতে পারে না।


কোনও ফাইল-নাম সংঘর্ষের সম্ভাবনা সম্পর্কে আপনার মন্তব্য ভাল ... আমি এটি পরীক্ষা করেছি এবং এটি অবশ্যই সমস্যা is আমি ম্যাট এর উত্তরের মন্তব্যে এর উপরে আরও কিছু লিখেছি .. এই সমস্যাটি প্রকাশের জন্য থানস্ক (+1)
পিটার.ও

2
প্রকৃতপক্ষে, [মাদুর s answer](http://unix.stackexchange.com/a/34258/9537), -v` এ বর্ণিত হিসাবে এবং যুক্তি কার্যভার কার্যকর হওয়ার পরে আলাদা are এছাড়াও -vপসিক্সে রয়েছে এবং awkবাস্তবায়নের সবচেয়ে প্রাচীন ব্যতীত সকলের মধ্যে উপস্থিত থাকা উচিত should ./ফাইলের নামটিতে একটি অ-শনাক্তকারী অক্ষর রয়েছে তা ব্যবহার বা নিশ্চিত করা সম্ভবত ছিন্নমূল হওয়ার সবচেয়ে নির্ভরযোগ্য উপায়।
jw013
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.