অন্য দুটি ভিন্ন লাইনের মধ্যে একটি লাইন (স্ট্রিং) অনুসন্ধান করুন


1

আমি এক liner কমান্ড (সর্বোত্তম ভাবে) অনুসন্ধান করছি যা নির্দিষ্ট স্ট্রিং / লাইনটি অন্য দুই লাইনের মাঝে উপস্থাপিত হবে কিনা তা খুঁজে পেতে পারে। আমি এটির জন্য অনুসন্ধান করি এবং আমি শুধুমাত্র দুটি লাইনের মধ্যে বিষয়বস্তু পেতে কমড খুঁজে পাই, তবে আমি কখনই উপস্থিত থাকতে পারি কিনা তা যাচাই করতে পারি।

.....
 1 a 2 b 3
 4
   5
.....
 1 c 2 d 3
 4
   5
.....
 1 e 2 f 3
   5
.....

আমি এটা খুঁজে পেয়েছি:

sed -n '/^ 1 .* 2 .* 3$/,/^ 5$/p'

এই কমান্ডের ফলাফলটি অবাঞ্ছিত লাইনগুলি শুরু করার জন্য ভাল (কাট লাইন "....") কেটে দেয়, তবে "4" এর মধ্যে উপস্থাপিত হলে কীভাবে তা পরীক্ষা করতে হয় তা এখনও জানা নেই:

 1 a 2 b 3
 4
   5
 1 c 2 d 3
 4
   5
 1 e 2 f 3
   5

আউটপুট এই মত চেহারা উচিত:

 "4" is missing after "1 e 2 f 3"

অথবা শুধুমাত্র (আরও ভাল):

"1 e 2 f 3"

উত্তর:


0

sed কাজের জন্য সঠিক হাতিয়ার নয়। যাইহোক, আমরা সম্ভবত এখনও এটা করতে পারেন sed:

sed -n '/^ 1 .* 2 .* 3$/,/^ 5$/ { /^ 1 .* 2 .* 3$/ { h }; /^ 4$/ { x; s/.*//; x;}; /^ 5$/ { x; p; x} }' filename | grep -v -e '^$'

এখানে কেবল সেই অংশটি যা আমি আপনার পরিসীমা ব্লকে যুক্ত করেছি:

/^ 1 .* 2 .* 3$/ { h }; /^ 4$/ { x; s/.*//; x;}; /^ 5$/ { x; p; x}

এই হিসাবে পড়ুন:

লাইন ম্যাচ regex যদি /^ 1 .* 2 .* 3$/তারপর, h (হোল্ড বাফার মধ্যে দোকান লাইন)
লাইন ম্যাচ regex যদি /^ 4$/তারপর, x (বিনিময় বাফার, অর্থাত স্ট্যান্ডার্ড বাফারের পরিবর্তে বাফার ধরে রাখার জন্য ক্রিয়াকলাপগুলি প্রয়োগ করুন), তারপরে সব কিছু হোল্ড বাফারে * প্রতিস্থাপন করুন, তারপরে x আবার (মান বাফার ফিরে সুইচ)
যদি লাইন মিল ^ 5$/তারপর, বাফার রাখা সুইচ, p (হোল্ড বাফারের মুদ্রণ সামগ্রী), এবং স্ট্যান্ডার্ড বাফারে ফিরে যান

* দুর্ভাগ্যবশত, s/.*// হোল্ড বাফার লাইন মুছে না। হোল্ড বাফারের লাইন মোছা কঠিন বলে মনে হয়, তাই আমরা পাইপিং দ্বারা তাদের পরিত্রাণ পেতে grep -v -e '^$' পরিবর্তে.

হালনাগাদ

এই সংস্করণটি মিলের পরে ফাইল নামটি মুদ্রণ করে (ব্যবহার করে F কমান্ড), এবং মধ্যে পাইপ ছাড়া পরিচালনা করে grep। ধন্যবাদ, পাওলো!

sed -n '/^ 1 .* 2 .* 3$/,/^ 5$/ { /^ 1 .* 2 .* 3$/ { h }; /^ 4$/ { x; s/.*//; x;}; /^ 5$/ { x; /^$/ !{ p; F }; x} }' data

ধন্যবাদ! আমার জন্য কাজ করে, এটা একটু জটিল কিন্তু সমস্যা হয় না :)। এক প্রশ্ন: কারন আমি আমার বাড়িতে ডির থেকে স্ক্রিপ্ট চালাচ্ছি এবং যে ফাইলগুলি চেক করতে হবে তা অন্যান্য ডিরের উপর আছে, কিন্তু তারা অনেক ... এখানে FILENAME টি মুদ্রণ করা সম্ভব ?? কারন আমি এখন কাজ করি না কিন্তু আমি জাদুকরী ফলাফল জানি না যা ফাইলে আছে :(
loken

আপনি ঠিক কিভাবে এই প্রক্রিয়া করা হয়? আমি শুধু সুপারিশ করবে echo একটি পৃথক লাইন ফাইল নাম। যদি আপনি এটি কীভাবে করবেন তা নিশ্চিত না হন, তবে আপনার স্ক্রিপ্টটিকে পেস্ট করতে বিনা দ্বিধায় যান এবং আমি আপনাকে কোথায় রাখতে হবে তার সুপারিশ করব echo
sneep

1
grep -v -e '^$' sed এই মধ্যে হতে পারে /^$/d (অথবা /^$/!p থেকে -n বিকল্প উপস্থিত)। GNUsed আছে F ফাইল নাম ইনপুট মুদ্রণ কমান্ড 1F আউটপুট প্রথম লাইন হিসাবে এটি মুদ্রণ করা হবে।
Paulo

আমি ব্যবহার করার চেষ্টা করেছিলাম d, কিন্তু এটি হোল্ডিং বাফারে কাজ বলে মনে হচ্ছে না, এবং এটি ব্লকের বাইরে লাফাতে এবং পরবর্তী লাইনের প্রক্রিয়াকরণ শুরু করতে লাগলো। যদিও আমি অন্যান্য পরামর্শ অন্তর্ভুক্ত করব! অনেক ধন্যবাদ!
sneep

ধন্যবাদ স্নাতকের !!! জরিমানা কাজ। আপনি কি আমি ব্যবহার করতে পারেন অন্যান্য প্রোগ্রাম কি সুপারিশ করতে পারেন - awk সম্ভবত? কেউ কি AWK সমাধান দিতে পারেন?
loken

0

ধন্যবাদ @sneep উল্লেখ করার জন্য perl:

perl -lane 'if($n=/^ 1 .* 2 .* 3$/../^ *5$/) {$s=$_ if $n==1; $s="" if /^ *4$/; print "$ARGV: $s" if $s && $n=~/E/}' /otherdir/*

আমি আশা করি সঠিকভাবে সমস্যাটি বুঝি: আরও বিস্তারিত জানার জন্য OP তে যোগ করুন।

ব্যাখ্যা:

perl প্রাকটিক্যাল এক্সট্রাকশন এবং রিপোর্টিং ভাষা।
-lane এক liners জন্য সাধারণত সহায়ক সুইচ।
' প্রকৃত প্রোগ্রাম নির্দেশাবলী শুরু
if(/^ 1 .* 2 .* 3$/../^ *5$/) { একটি লাইন মিলিয়ে শুরু যে টেক্সট টুকরা জন্য শুধুমাত্র কোঁকড়া ধনুর্বন্ধনী মধ্যে কর্ম সঞ্চালন /^ 1 .* 2 .* 3$/ এবং একটি একক ধারণকারী একটি লাইন দিয়ে শেষ 5 সংখ্যা, সম্ভবত স্থান কোন সংখ্যা দ্বারা পূর্বে।
$n=/^ 1 .* 2 .* 3$/../^ *5$/ টেক্সট অংশ মধ্যে লাইন নম্বর ট্র্যাক রাখুন।
$s=$_ if $n==1; টেক্সট অংশ প্রথম লাইন সংরক্ষণ করুন $s পরিবর্তনশীল।
$s="" if /^ *4$/; পছন্দসই স্ট্রিং জন্য চেহারা: একটি একক 4 স্পেস যে কোন সংখ্যা পরে আসে যে সংখ্যা। যদি পাওয়া যায়, জন্য পূর্বে সংরক্ষিত লাইন মুছে দিন $s পরিবর্তনশীল।
print "$ARGV: $s" if $s && $n=~/E/ ফাইলের নাম, একটি কোলন, একটি স্থান এবং লাইন মুদ্রণ করুন যদি বর্তমান পাঠ্য অংশটি পরিবর্তনশীল করে $s কোন টেক্সট এবং $n কাউন্টার দেখায় যে পাঠ্য অংশটির শেষ লাইনটি পৌঁছানো হয়েছে।
} পাঠ অংশে সঞ্চালিত কর্ম সমাপ্তি।
' প্রোগ্রাম নির্দেশের শেষ।
/otherdir/* সব ফাইল প্রক্রিয়া /otherdir/ পথ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.