দুটি প্যাটার্নের (এবং বাদে) লাইনগুলি মুদ্রণ করুন


13

আমি সিআরএল ব্যবহার করে ফর্ম জমা দিতে যাচ্ছি, যেখানে কিছু ফাইল অন্য ফাইল থেকে এসেছে, ব্যবহার করে নির্বাচন করা হয়েছে sed

যদি param1অন্য ফাইল থেকে লাইন মিলের প্যাটার্ন ব্যবহার করে থাকে তবে sedনীচের কমান্ডটি ভাল কাজ করবে:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

এখন, সমস্যা যান। আমি মিলে যাওয়া প্যাটার্নটি বাদ দিয়ে কেবল 2 টি মিলের প্যাটার্নের মধ্যে পাঠ্য প্রদর্শন করতে চাই।

আসুন বলে দেয় file.txt:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

বর্তমানে, প্রচুর "বিটউইন 2 ম্যাচিং প্যাটার্ন" sedকমান্ড মুছে ফেলবে না firstmatchএবং secondmatch

আমি ফলাফলটি হতে চাই:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

উত্তর:


15

আপনি এটি করতে পারেন এমন একটি উপায় এখানে:

sed '1,/firstmatch/d;/secondmatch/,$d' 

ব্যাখ্যা করা হয়েছে: প্রথম লাইন থেকে প্রথম মিলনের সাথে লাইন মিলছে , মুছুন। লাইনটি দ্বিতীয় লাইনের সাথে মিলিয়ে শেষ লাইনে, মুছুন।


6

জোর করে:

awk '
  $1 == "secondmatch" {print_me = 0}
  print_me {print}
  $1 == "firstmatch {print_me = 1}
'


গতির কি হবে?
গ্লেন জ্যাকম্যান

আমি মনে করি সময়মতো AWK এর বিপরীতে এসইডি এখানে উন্নত।
লিও লোপোল্ড হার্টজ 준영

5

অন্য sedসমাধানটি 1firstmatch ম লাইন 1 এ ব্যর্থ হলে ।

এটিকে সরল রাখুন, একটি একক পরিসর এবং একটি খালি 2 রেজেক্স ব্যবহার করুন:
হয় পরিসীমা ব্যতীত এই ব্যাপ্তির সমস্ত কিছু মুদ্রণ করুন (স্বয়ং-মুদ্রণ অক্ষম) 3 :

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

বা, সংক্ষিপ্ত, সেই ব্যাপ্তিতে থাকা না সমস্ত কিছু মুছুন এবং সীমাটি শেষ করেও মুছুন:

sed '/firstmatch/,/secondmatch/!d;//d' infile


1: কারণ হচ্ছে যে দ্বিতীয় ঠিকানা কোন RegExp হয়, তাহলে লাইন যা প্রথম ঠিকানা মিলেছে নিম্নলিখিত বিভক্তি ম্যাচের জন্য চেক লাইন দিয়ে শুরু হবে
সুতরাং, /firstmatch/ইনপুটটির প্রথম লাইনটির জন্য কখনই মূল্যায়ন করা হয় না , এটি লাইন নম্বরটির সাথে sedমেলে 1,/RE/এবং এটি দ্বিতীয় লাইনে চলে যায় যেখানে লাইনটি মেলে কিনা তা পরীক্ষা করে/firstpattern/

2: যখন কোনও রেগেক্স খালি থাকে (অর্থাত্ //) sedএমন আচরণ করে যে শেষ কমান্ড প্রয়োগ করা শেষ REGEX প্রয়োগ করা হয়েছিল (হয় ঠিকানা হিসাবে বা বিকল্প কমান্ডের অংশ হিসাবে) নির্দিষ্ট করা হয়েছিল।

3: ;}বাক্য গঠনটি আধুনিক sedবাস্তবায়নের জন্য; প্রবীণদের সাথে সেমিকোলনের পরিবর্তে একটি নতুন লাইন বা পৃথক এক্সপ্রেশন যেমন usesed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile


আপনি কি ব্যাখ্যা করতে পারেন //(এর ভিতরে {…}) কী করছে ?
জি-ম্যান

ধন্যবাদ, তবে আপনি আমার ফাঁদে পড়ে গেলেন। আমি জানি এটি //ব্যবহার করা সর্বশেষ নিয়মিত প্রকাশের অর্থ; আমি যা পড়েছি তা থেকে, তা হওয়া উচিত /secondmatch/। আপনার কমান্ড কাজ করে যাচাই করে আমি যাচাই করেছি এবং তাই আমি সিদ্ধান্ত নিয়েছি যে এটি কাজ করছে /firstmatch|secondmatch/(যা আপনি নিশ্চিত করেছেন) তবে আমি কোনও ডকুমেন্টেশন খুঁজে পাই না (এমনকি আপনি যে পিসিক্স নথিতে লিঙ্ক করেছেন বা জিএনইউ নয়) সেড ম্যানুয়াল ) যা এই আচরণটির বর্ণনা দেয়। … (চালিয়ে যাওয়া)
জি-ম্যান

(চালিয়ে যাওয়া) ... বিনোদনমূলক পরীক্ষা: (আমি) ইন sed: (1) যদি আমি তা করি /first/,4তবে এর //মতো কাজ করে /first/। (2) যদি আমি এটি করি 2,/second/, তবে //একটি "পূর্ববর্তী নিয়মিত প্রকাশের" ত্রুটি পাওয়া যায়। (আমি নির্ধারিত আচরণটি অনুসরণ করতে এটি নির্মম ব্যর্থতা বলে মনে করি)) (৩) যোগ করা --posixউপরের কোনওটিরও পরিবর্তন হয় না। (দ্বিতীয়) সালে অন্যান্য প্রোগ্রামের: (4) সালে vi, পরে /first/,/second/, //মত কাজ করে /second/(এবং অন্যান্য ফরম এছাড়াও নথিভুক্ত শাসনের মূলদ বাস্তবায়নের হয়)। … (চালিয়ে যাওয়া)
জি-ম্যান

(চালিয়ে যাওয়া) ... (5) awkমনে হয় "সর্বশেষ ব্যবহৃত আরআর  " এর কোনও ধারণা নেই; //কোনও অক্ষরের আগে বা পরে অ-চরিত্রকে বোঝায়। (আমি আপনাকে চেষ্টা করার জন্য আমন্ত্রণ জানিয়েছি echo -- | awk '{ gsub(//, "cha"); print }'।)
জি-ম্যান

সুতরাং, আপনি "শেষ কমান্ডে ব্যবহৃত সর্বশেষ REGEX" হিসাবে "শেষ কমান্ডে ব্যবহৃত সর্বশেষ REGEX (গুলি)" পড়েছিলেন এবং সুতরাং আপনি (সঠিকভাবে) অনুমান করেছিলেন যে এর অর্থ /first|second/। ভাগ্যবান তুমি. আমি অন্যান্য প্রোগ্রামগুলি উল্লেখ করে দেখানোর জন্য যে এটি কোনও সিস্টেম-ব্যাপী রেজেক্স কনভেনশন নয়। যে কেউ এটিকে যুক্ত করেছে এটি এটিকে যুক্ত করার sedবিরক্ত করে না vim, যেখানে এটি প্রায় ততটা জ্ঞান অর্জন করতে পারত। :-) ⁠
জি-ম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.