সেডে একাধিক বিস্ময়বোধক চিহ্ন ব্যবহার করার বিন্দু কী?


12

পসিক্স সেড ডকুমেন্টেশন বলেছেন:

একটি ফাংশন এক বা একাধিক 'আগে করা যেতে পারে'! অক্ষরগুলির ক্ষেত্রে, ঠিকানাগুলি প্যাটার্নের জায়গাটি নির্বাচন না করলে ফাংশনটি প্রয়োগ করা হবে। শূন্য বা আরও <ব্লেঙ্ক> অক্ষর প্রথম 'এর আগে গৃহীত হবে!' অক্ষর। <ব্লাঙ্ক> চরিত্রগুলি '' 'অনুসরণ করতে পারে কিনা তা অনির্দিষ্ট! চরিত্র, এবং অনুসারে অ্যাপ্লিকেশন একটি 'অনুসরণ করবে না!' <ব্ল্যাঙ্ক> অক্ষরযুক্ত অক্ষর।

সুতরাং, কোনও পসিক্স সেডের সাহায্যে আমরা এটি করতে পারি:

sed -e '/pattern/!d' file

এটি লেখার মতোই:

sed -e '/pattern/!!d' file

আর !!!dnবিস্ময়বোধক চিহ্ন এখনো জরিমানা (তিন সঙ্গে পরীক্ষা করা হয় sedথেকে সংস্করণ বংশগত দায় toolchest )। আমি এক उद्गारের পরিবর্তে একাধিকের মধ্যে কোনও লাভ দেখছি না।

কেন স্পেকটি সেই সিনট্যাক্সকে অনুমতি দিয়েছে এবং বাস্তব বিশ্বের প্রয়োগে এটি কীভাবে কার্যকর?


দেখে মনে হচ্ছে জিএনইউ সেড এই ক্ষেত্রে অনুগত নয়, আমরা একাধিক উদ্দীপনা ব্যবহার করলে অভিযোগ করবে:

$ sed -e '/pattern/!!d' file
sed: -e expression #1, char 11: multiple `!'s

2
এফডাব্লুআইডাব্লু: ওপেনবিএসডি অন !টগল হিসাবে কাজ করে, হিসাবে /pattern/!!একই /pattern/এবং /pattern/!!!একই হিসাবে /pattern/!। ফ্রিবিএসডি-তে একাধিক !একক হিসাবে একই।
lcd047

2
বৈশিষ্টগুলিতে প্রচুর পরিমাণের বিষয় হ'ল sedস্ক্রিপ্টগুলি উত্পন্ন করা যায়sedএকটি পসিক্স দেওয়া , এটি কোনও sedস্ক্রিপ্ট রচনাকে স্ক্রিপ্ট করা সত্যিকারের সহজ বিষয় হওয়া উচিত simple এবং তাই যদি আপনার কোনও মামলার জন্য কিছু ট্রিগার থাকে !যা আপনার ক্রিয়া যা কিছুতেই উপযুক্ত না এমন কোনও ঠিকানা চিহ্নিত করে , আপনি এমনকি সেই একই একাধিকবার ট্রিগার করতে পারেন এবং এখনও একই ফলাফল নিয়ে এসেছেন।
মাইকজার্ভ

@ কুওগলম না, কেবলমাত্র ফ্রিবিএসডি'র। জিএনইউ, ওপেনবিএসডি এবং নেটবিএসডি নেই sedare
lcd047

@ lcd047: হ্যাঁ, অবশ্যই আমার অদক্ষ ইংরেজির জন্য আমি দুঃখিত. মানে এটি অনুগত নয়, তাই না। এটা জেনে রাখা ভাল। তবে আমার প্রশ্নের মূল বিষয় হচ্ছে পসিক্স সেডের সাহায্যে সেই সিনট্যাক্সটি কীভাবে বাস্তব বিশ্বে কার্যকর হতে পারে?
কিউংলম

1
এফডাব্লুআইডাব্লু: ওপেনবিএসডি-কারেন্টে এর জন্য একটি সংশোধন করা হয়েছে।
lcd047

উত্তর:


5

sedএর এপিআই আদিম - এবং এটি নকশা দ্বারা। অন্তত, এটা আছে রয়ে নকশা আদিম - এটি শুরু আমি বলতে পারব না এ যে primitively পরিকল্পনা করা হয়েছিল। বেশিরভাগ ক্ষেত্রে একটি sedস্ক্রিপ্ট লেখা যা চালিত হলে, অন্য sedস্ক্রিপ্টটি আউটপুট দেয় সত্যই এটি সাধারণ বিষয়। sedম্যাক্রো প্রিপ্রোসেসর যেমন m4এবং / অথবা এর মাধ্যমে খুব প্রায়ই এইভাবে প্রয়োগ করা হয় make

(এরপরে যা যা ঘটেছিল তা হাইপোথিটিক্যাল ব্যবহারের ক্ষেত্রে: এটি একটি সমাধান অনুসারে ইঞ্জিনিয়ারড সমস্যা If


নিম্নলিখিত ইনপুট ফাইলটি বিবেচনা করুন:

cat <<"" >./infile
camel
cat dog camel
dog cat
switch
upper
lower

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

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

আর একটি জিনিস যা আমরা করতে পারি তা হ'ল ফাইলটিকে এখন প্রক্রিয়াজাতকরণের বিরুদ্ধে প্রক্রিয়াকরণ করা। আমরা উত্পাদন করতে পারি - এবং আমাদের সংকলনে অন্তর্ভুক্ত করতে পারি - একটি sedস্ক্রিপ্ট যা লাইন নম্বর অনুযায়ী সম্পাদনাগুলি প্রয়োগ করতে পারে - যা সাধারণত দীর্ঘমেয়াদে অনেক বেশি দক্ষ রুট।

উদাহরণ স্বরূপ:

n=$(printf '\\\n\t')
grep -En 'camel|upper|lower' <infile |
sed "   1i${n%?}#!/usr/heirloom/bin/posix2001/sed -nf
        s/[^:]*/:&$n&!n;&!b&$n&/;s/://2;\$a${n%?}q"'
        s/ *cat/!/g;s/ *dog/!/g
        s| *\([cul][^ ]*\).*|s/.*/\1-case/p|'

... যা sedস্ক্রিপ্ট আকারে আউটপুট লিখে এবং যা দেখতে ...

#!/usr/heirloom/bin/posix2001/sed -nf
:1
    1!n;1!b1
    1s/.*/camel-case/p
:2
    2!n;2!b2
    2!!s/.*/camel-case/p
:5
    5!n;5!b5
    5s/.*/upper-case/p
:6
    6!n;6!b6
    6s/.*/lower-case/p
q

যখন সেই আউটপুটটি আমার মেশিনে ./bang.sedচালিত টেক্সট ফাইলে সংরক্ষিত হয়েছে এবং নাম চালানো হয়েছে ./bang.sed ./infile, তখন আউটপুটটি হ'ল:

camel-case
upper-case
lower-case

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

মাল্টি-! তাত্ক্ষণিকভাবে আমার কাছে বিষয়টি বুঝতে পেরেছিল, যদিও - sedস্পেসিফিকেশনটির বেশিরভাগ অংশ কেবল পার্স করা এবং কেবল উত্পন্ন sed স্ক্রিপ্টগুলির দিকে থাকে। সেই প্রসঙ্গে আরও অনেক বেশি \nঅর্থবোধ করার জন্য আপনি সম্ভবত প্রয়োজনীয় ই -লাইন ডিলিমিটারগুলি খুঁজে পাবেন [wr:bt{]এবং আপনি যদি এই ধারণাটি মাথায় রাখেন তবে আপনি অনুমানের কিছু অন্যান্য দিক সম্পর্কে আরও ভাল ধারণা নিতে পারেন - (যেমন :কোনও ঠিকানা গ্রহণ না করা, এবং qঅস্বীকার করার মতো) 1 এর চেয়ে বেশি কোনও গ্রহণ করুন)

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

আমি যে বহু- বিবেচনা ! অন্য কারওের তুলনায় ঠিকানাগুলি সেই প্রসঙ্গে আরও কার্যকর হতে পারে তবে সত্যতার সাথে আমি এমন একটি ক্ষেত্রেও ভাবতে পারি না যেখানে আমি এটি খুব ভাল ব্যবহার করতে পেরেছি - এবং আমি sedঅনেক কিছুই। আমি আরও উল্লেখযোগ্যভাবে মনে করি যে জিএনইউ / বিএসডি sedউভয়ই এটি নির্দিষ্ট হিসাবে পরিচালনা করতে ব্যর্থ হয়েছে - এটি সম্ভবত খুব বেশি চাহিদা রয়েছে এমন অনুমানের একটি দিক নয়, এবং যদি কোনও বাস্তবায়ন এটি পর্যালোচনা করে তবে আমি সন্দেহ করি যে তাদের বাগগুলি @ বক্স ক্ষতিগ্রস্থ হবে ফলস্বরূপ ফলাফল।

তাই বলা হয়, ব্যর্থতা উল্লিখিত এই হ্যান্ডেল করতে হয় কোনো বাস্তবায়নের একটি বাগ যা সম্মতি ভান, এবং তাই আমি প্রাসঙ্গিক দেব বক্স নামক-এর জন্য এখানে করা হয় একটি ইমেল শুটিং মনে করি, এবং আমি আপনি না তা করার মনস্থ করা।


1
এটি এখন ওপেনবিএসডি-কারেন্টে স্থির হয়েছে।
lcd047

1
একের পরের স্পেসে! মুছে ফেলা হচ্ছে, এখানে কী চলছে!
cuonglm

@ কুওগলম - খুব অল্প দেরী, আমার ধারণা। আমার ধারণা থেকে আমি সম্ভবত আরও কাছে এসেছি।
মাইকসার্ভ

@ কুওগলম - আচ্ছা, ঠিক আছে, তবে এটি কী ... চিহ্নিত হিসাবে স্বীকৃত মানে কী?
মাইকজার্ভ

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