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


13

ইনপুট:

Select ASDF 325 sdfg sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg sdfg 4456 sdrg

আউটপুট:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

সুতরাং সংক্ষেপে আমার "সেড" "এসডিএফজি" থেকে "এক্সএক্সএলএক্সএক্স" দরকার।

বাট: কেবলমাত্র লাইনে "নির্বাচন করুন এএসডিএফ" স্ট্রিং রয়েছে .. আমি কীভাবে এটি করতে পারি? (সেড, অবাক ইত্যাদি: \)

উত্তর:


19

আপনি বেশিরভাগ সেড কমান্ডগুলিকে একটি ঠিকানা দিয়ে প্রিফিক্স করতে পারেন যেখানে তারা প্রয়োগ করে সেই লাইনগুলিকে সীমাবদ্ধ করতে। একটি ঠিকানা একটি লাইন নম্বর, বা একটি রেজিেক্স দ্বারা সীমিত করা যেতে পারে /

cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='

Peter.O, কমান্ড উপরের হিসাবে লিখিত কোনো প্রথম সংঘটন প্রতিস্থাপন করে দেবে উল্লেখ করা হয়েছে sdfgধারণকারী স্ট্রিং Select ASDF। আপনার যদি sdfgচতুর্থ কলামে কেবলমাত্র সঠিক ম্যাচটি পরিবর্তিত করতে হয় তবে আপনার এই পথে যাওয়া উচিত:

cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'

1
এসডিএফজি যুক্ত আরও একটি ক্ষেত্রের কী হবে ? যেমন। 5 এসডিএফগা
পিটার.ও

হুম, আসলে এটিও সমস্যা নয়। আমি আমার উত্তর আপডেট করেছি।
রাশ

ব্যবহারের জন্য কোনও বিকল্প রয়েছে: সেড '/ নির্বাচন করুন এএসডিএফ / জিএস = এসডিএফজি = এক্সএক্সএক্সএক্স =' - সুতরাং আমাকে কেবলমাত্র প্রথমটি নয়, সমস্ত লাইনে উপস্থিত থাকতে হবে। তবে
সেড

1
আপনাকে gশেষের পরে টাইপ করতে হবে =( sকমান্ডের শেষে )। : এটা মত এই হতে হবেsed '/Select ASDF/ s=sdfg=XXXX=g'
ভিড়ের

7

যদি আপনি কেবল কলাম 4 পরিবর্তন করে থাকেন তবে এর সঠিক মান থাকলে নিয়মিত প্রকাশের পরিবর্তে সাম্যতা অপারেটরগুলি ব্যবহার করা অর্থপূর্ণ হয়ে ওঠে।

awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'

1
দ্রুত! .. তুলনা, 1 মিলিয়ন লাইন জন্য, Birei এর awk এবং Rush এর সঙ্গে অবস্থানগত sed: 0m1.580s বনাম 0m3.792s বনাম 0m6.740s
Peter.O

1

ব্যবহার GNU awk:

awk '
    BEGIN { IGNORECASE = 1 } 
    /^select asdf/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

আউটপুট:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

আপডেট : IGNORECASEঅ-জিএনইউ-র জন্য এড়িয়ে চলুন awkএবং কেস-সংবেদনশীলের সাথে মেলে। Jw013 কে ধন্যবাদ , যিনি এই বিস্তারিতটি উল্লেখ করেছেন:

awk ' 
    /^Select ASDF/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

1
আপনার উল্লেখ IGNORECASEকরা উচিত একটি জিএনইউ awk/ gawkএক্সটেনশন।
jw013

1
@ jw013: আপনাকে ধন্যবাদ আপনার পরামর্শ সহ আপডেট উত্তর।
বিরেই

4
আইজিএনরেসিএস এই ক্ষেত্রে ভুল, এটি জিএনইউ বা জিএনট হোক না কেন .. প্রশ্নের মানদণ্ড স্পষ্টভাবে উচ্চ-মামলার জন্যASDF
পিটার.ও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.