সেড কমান্ড -i বিকল্প ম্যাকের সাথে ব্যর্থ হয়েছে, তবে লিনাক্সে কাজ করে


303

sedলিনাক্সে পাঠ্য অনুসন্ধান / প্রতিস্থাপনের জন্য আমি নিম্নলিখিত কমান্ডটি সফলভাবে ব্যবহার করেছি :

sed -i 's/old_link/new_link/g' *

যাইহোক, আমি যখন আমার ম্যাক ওএস এক্স এ চেষ্টা করি তখন আমি পাই:

"কমান্ড সি প্রত্যাশা করে text অনুসরণ করে পাঠ্য"

আমি ভেবেছিলাম আমার ম্যাকটি একটি সাধারণ বেস শেল চালায়। কি খবর?

সম্পাদনা করুন:

@ হাই পারফরম্যান্স অনুসারে, এটি ম্যাকের sedআলাদা (বিএসডি) স্বাদ থাকার কারণে , সুতরাং আমার প্রশ্নটি কীভাবে এই বিএসডিতে এই আদেশটি প্রতিলিপি করব sed?

সম্পাদনা করুন:

এখানে আসল উদাহরণ যা এটির কারণ:

sed -i 's/hello/gbye/g' *

1
এর অর্থ হ'ল sedকমান্ড হিসাবে আপনার ডেটাতে একটি "সি" দেখুন। আপনি একটি পরিবর্তনশীল ব্যবহার করছেন? দয়া করে এমন কিছু পোস্ট করুন যা প্রকৃত কমান্ড এবং আপনি প্রক্রিয়া করছেন এমন কিছু ডেটা আরও ঘনিষ্ঠভাবে উপস্থাপন করে। আপনি এই ত্রুটিটির একটি সাধারণ প্রদর্শনটি করতে পারেন echo x | sed c
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস, উপরের সরল কমান্ডটি এর কারণ ঘটেছে, যদিও এইচটিএমএল এবং সিএসএস ফাইলগুলি সহ এটির প্রক্রিয়াকরণ করা ডেটা একটি সম্পূর্ণ ওয়েবসাইট (আমি সমস্ত চিত্রের লিঙ্কগুলি রূপান্তর করছি) ...
ইয়ারিন

উত্তর:


396

আপনি যদি -iবিকল্পটি ব্যবহার করেন তবে আপনার ব্যাকআপগুলির জন্য আপনাকে একটি এক্সটেনশান সরবরাহ করতে হবে।

যদি তোমার থাকে:

File1.txt
File2.cfg

কমান্ড (নোট মধ্যে স্থান অভাব -iএবং ''এবং -eএটি Mac ও গনুহ নতুন সংস্করণের উপর কাজ করতে):

sed -i'.original' -e 's/old_link/new_link/g' *

2 টি ব্যাকআপ ফাইল তৈরি করুন:

File1.txt.original
File2.cfg.original

ব্যাকআপ ফাইলগুলি এড়ানোর কোনও পোর্টেবল উপায় নেই কারণ সমস্ত ক্ষেত্রে কাজ করে এমন সেড কমান্ডের মিশ্রণ পাওয়া অসম্ভব:

  • sed -i -e ...- -eব্যাকআপ তৈরি করার কারণে ওএস এক্সে কাজ করে না
  • sed -i'' -e ... - ওএস এক্স 10.6 এ কাজ করে না তবে 10.9+ এ কাজ করে
  • sed -i '' -e ... - জিএনইউতে কাজ করছেন না

দ্রষ্টব্য যে সমস্ত প্ল্যাটফর্মগুলিতে একটি সেড কমান্ড কাজ করছে না তা প্রদত্ত, আপনি একই ফলাফল অর্জন করতে অন্য একটি কমান্ড ব্যবহার করার চেষ্টা করতে পারেন।

যেমন, perl -i -pe's/old_link/new_link/g' *


4
আমারও একই প্রশ্ন ছিল. এই সমাধানের জন্য ধন্যবাদ। তবে যেখানে আমি 'মিন সেড' এর সাথে '-i' এর বিবরণ সন্ধান করার চেষ্টা করেছি, ব্যাকআপগুলি উপেক্ষা করার জন্য -i 'ব্যবহারের কিছুই নেই। এটি আমার প্রথম দোষ দ্বিতীয়ত, যখন ত্রুটিটি "কমান্ডটি প্রত্যাশা করে text এরপরে পাঠ্য অনুসরণ করে" প্রদর্শিত হবে, কেন এটি সরাসরি আমাদেরকে জানায় না যে এটি '-i' বিকল্পের জন্য একটি ব্যাকআপের নাম আশা করে !! ?? এ জাতীয় জিনিস সর্বত্রই ঘটে: আপনি ত্রুটি পেয়েছেন তবে ত্রুটি কেন নয়, তারপরে আপনি সেই ম্যানুয়ালটি অনুসন্ধান করেন যা এটি সম্পর্কে কিছুই ব্যাখ্যা করে না। তারপরে আপনি এটি গুগল করে অন্য কারও সন্ধান করতেও একই সমস্যা রয়েছে। মানে, ম্যানুয়ালটিতে উদাহরণ দিচ্ছেন না কেন?
lukmac

বা ত্রুটিটি ঘটে যা কেবলমাত্র একটি তথ্য-কম বার্তার পরিবর্তে সেখানে ত্রুটি কেন তা আমাদের বলুন। এটি সমস্ত সরঞ্জাম প্রস্তুতকারীদের কাছে একটি পরামর্শ, যদি তারা এই মন্তব্যটি কখনও পড়তে পারেন।
lukmac

5
@ লুকম্যাক যতদূর sedবলতে পারে, আপনি একটি ব্যাকআপ প্রত্যয় সরবরাহ করেছিলেন। ব্যাকআপ প্রত্যয়টি হ'ল s/old_link/new_link/g। তারপরের পরবর্তী যুক্তিটি হ'ল সম্পাদনা আদেশগুলি। যেহেতু এটি কমান্ডগুলি ব্যাকআপের নাম হিসাবে ব্যাখ্যা করে, এরপরে এটি প্রথম ফাইলের নামটি সম্পাদনা কমান্ড হিসাবে নিয়েছিল তবে সেগুলি বৈধ ছিল না।
বারমার

2
এটি কি সর্বদা একটি সমস্যা হবে? কোনও উপায় আছে যে অ্যাপল ওএসএক্সের সাথে জিএনইউ সেড একটি কার্যনির্বাহ / প্যাকেজ তৈরি করতে সক্ষম হতে পারে? বা, জিএনইউ সেড সমর্থন করতে পারে না sed -i '' -e ...?
ব্লু

5
sed -i'' -eম্যাক 10.14
MoOx

64

আমি ওএস এক্স-তে বিশ্বাস করি যখন আপনি -i ব্যবহার করেন তবে ব্যাকআপ ফাইলগুলির জন্য একটি এক্সটেনশন প্রয়োজন । চেষ্টা করুন:

sed -i .bak 's/hello/gbye/g' *

GNU ব্যবহার sedকরে এক্সটেনশন al চ্ছিক


55

এটি জিএনইউ এবং বিএসডি উভয় সংস্করণের সাথে কাজ করে:

sed -i'' -e 's/old_link/new_link/g' *

বা ব্যাকআপ সহ:

sed -i'.bak' -e 's/old_link/new_link/g' *

-iবিকল্পের পরে অনুপস্থিত স্থান নোট করুন ! (জিএনইউ সেডের জন্য প্রয়োজনীয়)


7
প্রথম এক ওএসএক্স কাজ (আমি শুধু 10.6.8 তে এটি পরীক্ষিত থাকেন) না
Marcin

4
ওএস এক্সে আমার জন্য (10.10.3), প্রথমটি তৈরি করা ব্যাকআপ ফাইল -e এর সাথে প্রত্যয়যুক্ত। ভাল না. দ্বিতীয়টি হ'ল উবুন্টু এবং ওএস এক্সের মধ্যে আমার পক্ষে ধারাবাহিকভাবে কাজ করা। আমি যদিও ব্যাকআপ ফাইল চাইনি, সুতরাং rmএটি মুছার পরে আমাকে ঠিক কমান্ড চালাতে হয়েছিল ।
ব্রেন্ডন

1
প্রথম লাইনটি 10.10: sed -i'' ...=> এ কাজ করার জন্য একটি স্থান দিয়ে আবার লিখতে হবে sed -i '' ...
ড্যানিয়েল জম্পে

3
@ ড্যানিয়েল জম্পে তবে এই স্থানটি যুক্ত করা জিএনইউ সেডে কাজ করবে না
ব্রাইস

1
@ মার্সিন প্রথমটি আমার জন্য ওএসএক্স 10.11.2 তেও কাজ করে। কেবলমাত্র এটি হ'ল এটি একটি ব্যাকআপ ফাইল তৈরি করে, যা পরে অপসারণ করা দরকার। দ্বিতীয়টি আরও ভাল দেখায়, কারণ পরে আমাদের ফাইলের নামটি বের করতে হবে না।
vikas027

41

ম্যাকের একই সমস্যা ছিল এবং এটির মাধ্যমে সমাধান করেছেন brew:

brew install gnu-sed

এবং হিসাবে ব্যবহার করুন

gsed SED_COMMAND

আপনি (যদি আপনি চাইলে) sedউপন্যাস হিসাবে সেটও gsedকরতে পারেন:

alias sed=gsed


1
এর মতো উপন্যাস স্থাপন করা কোনও দুর্দান্ত ধারণা নয়
সান্তাএক্সএল

1
সম্পর্কিত উপন্যাসের পৃষ্ঠায় প্রস্তাবিত কোনও উপাধিকার পরিবর্তে, এটিকে যুক্ত করুন: PATH = "$ (ব্রিউ - প্রিফিক্স) / opt / gnu-sed / libexec / gnubin: AT PATH"
y.luis

24

অথবা, আপনি আপনার ম্যাকের সিডের জিএনইউ সংস্করণ ইনস্টল করতে পারেন, তাকে জিএসড বলা হয় এবং এটি স্ট্যান্ডার্ড লিনাক্স সিনট্যাক্স ব্যবহার করে ব্যবহার করতে পারেন।

তার জন্য, gsedবন্দরগুলি ব্যবহার করে ইনস্টল করুন (যদি আপনার এটি না থাকে তবে তা চালিয়ে http://www.macport.org/ এ পান ) sudo port install gsed। তাহলে, আপনি চালাতে পারেনsed -i 's/old_link/new_link/g' *


24
.. বা যদি আপনি হোমব্রু ব্যবহার করেন তবে ইনস্টল করুনgnu-sed
সুদার

1
ধন্যবাদ সুদার, ডাবল-থাম্বস আপ!
অ্যান্ড্রু সোয়ান

9

আপনার ম্যাক প্রকৃতপক্ষে একটি বেস শেল চালায়, তবে আপনি কোনটি সেডের প্রয়োগের সাথে লেনদেন করছেন তা আরও প্রশ্ন। একটি ম্যাক সেডে বিএসডি থেকে আসে এবং সেডের থেকে আলাদাভাবে আপনি আলাদা লিনাক্স বাক্সে খুঁজে পেতে পারেন। আমি আপনাকে পরামর্শ man sed



5
@ ইয়্যারিন - না, এবং আমি যদি মানুষ সেডের দিকে তাত্ক্ষণিকভাবে নজর রাখি তবে তা আপনাকে কিছুই বলে না। আরও দীর্ঘ এক নজরে চেষ্টা করুন।
উচ্চ পারফরম্যান্স মার্ক

21
বেশিরভাগ এসও উত্তরগুলি কোনও ব্যক্তির মধ্যে কোথাও সমাহিত করা হয় তবে
এসটিও হ'ল

9

সিনেট্রিসের উত্তর সঠিক, তবে আমি findকোন ফাইলগুলি পরিবর্তন করতে চাই সে সম্পর্কে আরও সুনির্দিষ্ট হওয়ার জন্য কমান্ড সহ এটি ব্যবহার করি। সাধারণভাবে এটি কাজ করা উচিত (অসক্সে পরীক্ষিত /bin/bash):

find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;

সাধারণত যখন জটিল প্রকল্পগুলিতে ব্যবহার sedনা findকরা হয় কম দক্ষ is


-execখুব সুন্দর! আমি কেবল ভাবছিলাম যে শেষের
ইয়ে লিউ

2
@ ইয়েলুই: দ্য ছাড়া \, ;আমি শেলটির দ্বারা ব্যাখ্যা করেছিলাম যখন আমি এইরকম চেষ্টা করেছি
সার্ভ-ইনক

2

আমি sedম্যাকওএস (ম্যাকোস 10.12 এ পরীক্ষিত) এবং অন্যান্য ওএসের মধ্যে পার্থক্য পরিচালনা করার জন্য একটি ফাংশন তৈরি করেছি :

OS=`uname`
# $(replace_in_file pattern file)
function replace_in_file() {
    if [ "$OS" = 'Darwin' ]; then
        # for MacOS
        sed -i '' -e "$1" "$2"
    else
        # for Linux and Windows
        sed -i'' -e "$1" "$2"
    fi
}

ব্যবহার:

$(replace_in_file 's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' "./mysql/.env")

কোথায়:

, একটি বিস্ময়কর

's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' প্যাটার্ন হয়

"./mysql/.env" ফাইল করার পথ


1

টেমপ্লেট ফাইলটিতে পরিবেশের ভেরিয়েবল কীভাবে প্রয়োগ করবেন তা এখানে (ব্যাকআপের প্রয়োজন নেই)।

1. পরবর্তী প্রতিস্থাপনের জন্য template {FOO} with সহ টেম্পলেট তৈরি করুন।

echo "Hello {{FOO}}" > foo.conf.tmpl

2. OO {FOO} F এফইও ভেরিয়েবল এবং আউটপুট নতুন foo.conf ফাইলে প্রতিস্থাপন করুন

FOO="world" && sed -e "s/{{FOO}}/$FOO/g" foo.conf.tmpl > foo.conf

ম্যাকোস 10.12.4 এবং উবুন্টু 14.04.5 উভয়ই কাজ করছে


0

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

ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml

আমার ক্ষেত্রে, আমাকে এটি কোনও rakeটাস্ক থেকে কল করা প্রয়োজন (অর্থাত্ রুবি স্ক্রিপ্টের অভ্যন্তরে), সুতরাং আমি এই অতিরিক্ত স্তরের উদ্ধৃতি ব্যবহার করেছি:

sh %q{ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml}

-1
sed -ie 's/old_link/new_link/g' *

বিএসডি এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করে


3
এটি লিনাক্সে eসংযুক্ত অন্য একটি ফাইলের নাম তৈরি করে
ব্রাইস

1
ভাঙা, এটি অপসারণ করা ভাল।
sorin

এটি ম্যাক এবং লিনাক্সে কাজ করছে। এই সমাধান সঙ্গে সমস্যা কি?
ইসলাম আজাব

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