কিভাবে একটি মাল্টি লাইন কোড সেড সঙ্গে প্রতিস্থাপন?


9

আমার একটি বড় ফাইল রয়েছে এতে বিশেষ অক্ষর রয়েছে। সেখানে একটি মাল্টি লাইন কোড রয়েছে, যা আমি এটির সাথে প্রতিস্থাপন করতে চাই sed

এই:

  text = "\
    ------                                                           ------\n\n\
    This message was automatically generated by email software\n\
    The delivery of your message has not been affected.\n\n\
    ------                                                           ------\n\n"

এটিতে পরিণত হওয়ার দরকার:

text = ""

আমি নিম্নলিখিত কোড চেষ্টা করেছিলাম, কিন্তু ভাগ্য নেই:

sed -i '/  text = "*/ {N; s/  text = .*affected.\./  text = ""/g}' /etc/exim.conf

এটি কোনও কিছু প্রতিস্থাপন করে না এবং কোনও ত্রুটি বার্তা প্রদর্শন করে না

আমি এটি নিয়ে খেলছি, তবে আমি যা চেষ্টা করি তা কার্যকর হয় না।


এটি হওয়া দরকার sedবা আপনি অন্য সরঞ্জামের জন্য উন্মুক্ত? ব্লকের "ভিতরে কি থাকতে পারে text=? text = আপনার ফাইলে অন্য মামলা থাকতে পারে ? সর্বদা 4 টি পাঠ্য পাঠ্য থাকবে বা আরও কম / কম থাকতে পারে?
টেরডন

সাধারণত sed, বা এমন কোনও কিছু যা সেন্টোস সার্ভারে ইনস্টলেশন প্রয়োজন হয় না। বাক্স সরঞ্জামগুলির বাইরে
ব্লেড 19899

@terdon text = ফোল্ডারে অন্য কোনও নেই , আউট আউট হওয়া দরকার text = ""। ফাইলগুলিতে কোডের 891 লাইন রয়েছে। সুতরাং, এটি অন্য পাঠ্যের সম্মান করতে হবে।
ব্লেড 19899

আপনি কি ফাইলটি ওভাররাইট করতে চান বা কেবল আউটপুট পরিবর্তন করতে চান?
joH1

পুনঃটুইট করুন এটি কেবল পাঠ্যটি প্রতিস্থাপন করতে হবে - যেমন আমার প্রশ্নে দেখা গেছে - তে text = ""। আমার প্রশ্নে দেখা গেছে।
ব্লেড 19899

উত্তর:


15

উদ্ধারের জন্য পার্ল:

perl -i~ -0777 -pe 's/text = "[^"]+"/text = ""/g' input-file
  • -i~ ব্যাকআপ অনুলিপি রেখে "জায়গায়" ফাইলটি সম্পাদনা করবে
  • -0777 একসাথে পুরো ফাইলটি পড়ে, একসাথে লাইনে না

প্রতিস্থাপনটি s///সেডের মতো একইভাবে কাজ করে (অর্থাত্ এটি text = "ডাবল উদ্ধৃতি পর্যন্ত ডাবল উদ্ধৃতিতে বহুগুণে কিছু মিলায়) তবে এই ক্ষেত্রে এটি পুরো ফাইলটিতে কাজ করে।


5

আপনাকে যেমন প্যাটার্নের জায়গাটি পরীক্ষা করতে হবে এবং Nউদাহরণের সাথে মেলে না তবে এক্স লাইনে টানতে হবে

sed '/text = "/{              # if line matches text = "
:b                            # label b
$!N                           # pull in the next line (if not the last one)
/"$/!bb                       # if pattern space doesn't end with " go to label b
s/".*"/""/                    # else remove everything between the quotes
}' infile

সঙ্গে gnu sedযদি আপনি শব্দটি লিখতে পারেন

sed '/text = "/{:b;$!N;/"$/!bb;s/".*"/""/}' infile

এটি যদিও খুব দক্ষ নয়, ভাল কেবলমাত্র পরিসীমাটি নির্বাচন করুন /text = "/,/"/, প্রথম লাইনটি সংশোধন করুন এবং বাকিগুলি মুছুন:

sed '/text = "/,/"/{            # in this range
/text = "/!d                    # delete all lines not matching text = "
s/\\/"/                         # replace the backslash with quotes (this is only
}' infile                       # executed if the previous d wasn't executed)

আবার, gnu sedআপনি এটি ওয়ান-লাইনার হিসাবে লিখতে পারেন:

sed '/text = "/,/"/{/text = "/!d;s/\\/"/}' infile

3

ব্যক্তিগতভাবে, আমি পার্লে এটি করব। যদি আমরা ধরে নিতে পারি যে "বন্ধ হওয়ার আগে কোনও নেই তবে "আপনি এটি করতে পারেন:

perl -0pe 's/(text\s*=\s*)".*?"/$1""/s' file

-0সম্পূর্ণ ফাইল slurps, মেমরিতে এটা পড়া। এর দ্বারা -pপ্রদত্ত স্ক্রিপ্ট প্রয়োগ করার পরে "প্রতিটি লাইন মুদ্রণ করুন (এখানে, একটি" লাইন "সম্পূর্ণ ফাইল হবে) -e"। স্ক্রিপ্ট নিজেই একটি সহজ বিকল্প অপারেটর। এটি স্ট্রিংকে text0 বা তার বেশি শ্বেতস্পেসের অক্ষর, একটি =এবং 0 বা আরও শ্বেতস্থান আবার ( text\s*=\s*) ক্যাপচার করবে এবং এটি হিসাবে সংরক্ষণ করবে $1। তারপরে, এটি ক্যাপচার করা প্যাটার্নের পাশাপাশি সংক্ষিপ্ত উদ্ধৃতিযুক্ত স্ট্রিংটি এটি প্যাটার্ন ( $1) এবং এর সাহায্যে প্রতিস্থাপন করবে ""sপতাকা তোলে .ম্যাচ নতুন লাইন।


সংশোধন, -00অনুচ্ছেদে পড়ে, পুরো ফাইল ( রেফ ) নয়। উদ্ধৃতিতে থাকা পাঠ্যে যদি একটি ফাঁকা রেখা থাকে, তবে রেজেক্সটি মিলবে না।
গ্লেন জ্যাকম্যান

@ বেগুনজ্যাকম্যান আরগ! আমি সবসময় তাদের মিশ্রিত করি। । যে কারণে আমি অতিরিক্ত অনুচ্ছেদ যুক্ত করে দৌড়ে ডাবল চেক করেছি perl -00ne 'print;exit'। এবং আমি এখনও আমার উত্তরে ভুলটি রেখেছি! ধন্যবাদ, এখনই স্থির।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.