ইন-প্লেস তর্ক করার জন্য একাধিক অভিব্যক্তি সহ সেড


24

আমি ব্যবহার করে ফাইলের একাধিক শব্দ প্রতিস্থাপন করার চেষ্টা করছি sed -i #expression1 #expression2

ফাইল

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

আউটপুট (পছন্দসই)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

ব্যবহার করে দেখুন আউট

আমি sed -i2 বার ব্যবহার করে নিম্নলিখিত আউটপুট পেতে পারি ।

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

এটিকে সিঙ্গল ইন-প্লেস কমান্ড হিসাবে তৈরি করার কোনও সম্ভাব্য উপায় আমার কি আছে?

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

আমি যখন কোডটির উপরে চেষ্টা করেছি তখন এটি s/item/stuff/gফাইল হিসাবে লাগে এবং এটিতে কাজ করার চেষ্টা করে ..


যদি আপনার ফাইলগুলি উপরের উদাহরণের মতো হয় (যেমন তারা একই প্যাটার্ন অনুসরণ করে) তবে আপনি এটি একক প্রতিস্থাপনের মাধ্যমে করতে পারেন:sed - i 's/Some\(.*\)item/any\1stuff/' file
ডোন_ক্রিসটি

উত্তর:


26

sedআপনার সিস্টেমে সংস্করণ অনুসারে আপনি করতে সক্ষম হবেন

sed -i 's/Some/any/; s/item/stuff/' file

কমান্ডটিতে gচূড়ান্ত স্ল্যাশের পরে আপনার দরকার sনেই, কারণ আপনি প্রতি লাইনে কেবল একটি প্রতিস্থাপন করছেন।

বিকল্পভাবে:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iবিকল্প বলে sedজায়গায় ফাইলটি সম্পাদন করা; যদি পরে অবিলম্বে অক্ষর -iতারপর sedমূল ফাইল একটি ব্যাকআপ করে তোলে এবং ব্যাকআপ ফাইলের এক্সটেনশন হিসাবে যারা অক্ষর ব্যবহার করে। যেমন,

sed -i.bak 's/Some/any/; s/item/stuff/' file

অথবা

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

fileআসলটি এতে সংরক্ষণ করে সংশোধন করবে file.bak

অবশ্যই, ইউনিক্স (বা ইউনিক্সের মতো) সিস্টেমে আমরা সাধারণত '.bak' এর পরিবর্তে '~' ব্যবহার করি, তাই

sed -i~ 's/Some/any/;s/item/stuff/' file

2
মনে রাখবেন আপনি জিএনইউ রূপটি বর্ণনা করছেন। বিএসডি বৈকল্পিক (যেমন ফ্রিবিএসডি বা ওএস / এক্স এর মতো) এর জন্য একটি আর্গুমেন্ট প্রয়োজন-i । তাই sed -i '' 's/a/b/;s/c/d/' fileবা sed -i .back 's/a/b/;s/c/d/'বা sed -i.back 's/a/b/;s/c/d/'আছে। অন্যান্য sedবাস্তবায়ন সাধারণত সমর্থন করে না -i
স্টাফেন চেজেলাস

এটি পরিষ্কার করার জন্য @ স্টাফেনচাজেলাসকে ধন্যবাদ এবং আমার ধারণা, জিএনইউ সেডে এবং এক্সটেনশনের মধ্যে কোনও স্থান থাকতে পারে না বলে আমার আরও স্পষ্ট হওয়া উচিত ছিল -i
প্রধানমন্ত্রী 2 রিং

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpফলাফলগুলির sed: -e expression #1, char 141: unterminated 'কমান্ড`
আলহালাল

@ আলহেলাল দুঃখিত, মন্তব্যগুলি প্রশ্ন জিজ্ঞাসা করার উপযুক্ত জায়গা নয়। তবে যাইহোক, আপনার শেষ sকমান্ডটি এর চূড়ান্ত অনুপস্থিত /
প্রধানমন্ত্রী 2 রিং

@ পিএম 2 রিং করায় আমি বুঝতে পারিনি যে এটি অনুমান করা হয়েছে যে এটি আপনার সমাধান সম্পর্কিত। তবে, আপনাকে ধন্যবাদ।
আলহালাল

10

আপনি ";" এর সাথে একসাথে সেড এক্সপ্রেশন চেইন করতে পারেন;

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

একাধিক -eবিকল্প ব্যবহার করে একাধিক অভিব্যক্তি :

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

অথবা আপনি কেবল একটি ব্যবহার করতে পারেন:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

যখন কিছু প্রয়োগের সময় থেকেই, ব্যাকআপ ফাইলের জন্য একটি এক্সটেনশন দিতে হবে sed, মত ওএসএক্স sed খালি এক্সটেনশন সাথে কাজ করে না (আপনি ব্যবহার করা আবশ্যক sed -i ''মূল ফাইল ওভাররাইড করতে)।


1

আপনি এক্স মোডে ভিম ব্যবহার করতে পারেন:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % সমস্ত লাইন নির্বাচন করুন

  2. s বিকল্প

  3. x সংরক্ষণ করেন এবং বন্ধ করেন

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