সেড দিয়ে স্ল্যাশযুক্ত স্ট্রিংগুলি কীভাবে প্রতিস্থাপন করবেন?


147

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

প্রোজেক্টে ইউআরএলএস যেমন ? পৃষ্ঠা = এক হিসাবে রয়েছে । সার্ভারে লিঙ্কটি বৈধ হওয়ার জন্য এটি অবশ্যই / পৃষ্ঠা / এক হতে হবে ।

আমি স্থাপনের আগে আমার কোডফাইলে থাকা সমস্ত ইউআরএলএস বদলি করার সিদ্ধান্ত নিয়েছি, তবে আমি স্ল্যাশে আটকে আছি।

আমি জানি এটি একটি সুন্দর সমাধান নয়, তবে এটি সহজ কারণটি আমাকে অনেক সময় সাশ্রয় করতে পারে। আমাকে প্রতিস্থাপন করতে পারা মোট স্ট্রিংয়ের সংখ্যা 10 এরও কম। 30 টি ফাইল যা যাচাই করতে হয় তার মোট সংখ্যা ~ 30।

আমার পরিস্থিতি বর্ণনা করার উদাহরণ নীচে রয়েছে:

কমান্ড আমি ব্যবহার করছি:

sed -f replace.txt < a.txt > b.txt

প্রতিস্থাপন.টিএসটিতে সমস্ত স্ট্রিং রয়েছে:

s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g

a.txt:

?page=one&
?page=two&
?page=three&

আমি আমার সেড কমান্ড চালানোর পরে b.txt এর সামগ্রী:

pageone
pagetwo
pagethree

আমি কী চাই b.txt এর মধ্যে:

/page/one
/page/two
/page/three


উত্তর:


274

সবচেয়ে সহজ উপায় হ'ল আপনার সন্ধানে / পৃথক রেখাগুলিতে একটি ভিন্ন ডিলিমিটার ব্যবহার করা, যেমন:

s:?page=one&:pageone:g

আপনি কোনও অক্ষরকে সীমানা হিসাবে ব্যবহার করতে পারেন যা কোনও স্ট্রিংয়েরই অংশ নয়। বা, আপনি একটি ব্যাকস্ল্যাশ দিয়ে এড়াতে পারে:

s/\//foo/

যা দিয়ে প্রতিস্থাপন /করা হবে foo। আপনি সেই ক্ষেত্রে পালিয়ে যাওয়া ব্যাকস্ল্যাশ ব্যবহার করতে চান যেখানে প্রতিস্থাপনের স্ট্রিংগুলিতে কী কী অক্ষর সংঘটিত হতে পারে তা আপনি জানেন না (উদাহরণস্বরূপ যদি তারা শেল ভেরিয়েবল হয়)।


1
> অথবা, আপনি ব্যাকস্ল্যাশ দিয়ে এড়াতে পারেন। এর একটি উদাহরণ আরও কার্যকর হবে কারণ আপনি সর্বদা জানেন না যে আলাদা কিছু চয়ন করতে সক্ষম হওয়ার জন্য স্ট্রিংয়ের মধ্যে অক্ষরগুলি কী। যেমন, এটি: প্রতিধ্বনি / | সেড এস / \ // এ / জি কাজ করে না: সেড: -e এক্সপ্রেশন # 1, চর 5: অজানা বিকল্প `গুলি '
ম্যাক্স ওয়াটারম্যান

1
আপনি একটি যোগ করতে পারেন তাহলে? ধন্যবাদ :) আমি ডাবল উদ্ধৃতিতে আশেপাশে কাজ করেছি বলে মনে হচ্ছে: প্রতিধ্বনি / | সেড "এস / \ // এ / জি"
ম্যাক্স ওয়াটারম্যান

@ ম্যাক্সওয়াটারম্যান এটি স্ট্যান্ডার্ড অপারেটিং পদ্ধতিটি ব্যবহার করার সময় যখন sedরেজেক্স কমান্ডটি ডাবল কোটে দেওয়া হয়। আমি আমার উত্তরে সেগুলি ব্যবহার করিনি কারণ আমি পুরো sedকমান্ড লাইনটি sedদেখছিলাম না তবে ওপি যেমন করেছে ঠিক তেমনই রেজেক্স কমান্ড স্ট্রিং। যদি আপনি এটি কোনও ফাইলে রাখেন, যেমন ওপি করেছে, আপনার উদ্ধৃতিগুলির দরকার নেই।
লুকার

হ্যাঁ, যথেষ্ট ন্যায্য (যদিও এটি উল্লেখ করা যেতে পারে)। এই উদাহরণ সাহায্য করে। আমি খুঁজে পেয়েছি যে আমাকে মাঝে মধ্যে প্রচুর এবং প্রচুর ব্যাকস্ল্যাশ লাগানো দরকার ... এবং এটি সত্যিই বিভ্রান্ত হয়ে যায়। উদাহরণস্বরূপ- "" s / '/ \\\\\\\ & / g "আমি মনে করি পাঠ্যটি ভুল, যদিও:" কোনটি oo foo এর সাথে প্রতিস্থাপন করবে "-" foo এর সাথে / প্রতিস্থাপন করবে "কোনটি হওয়া উচিত?
ম্যাক্স ওয়াটারম্যান

@ ম্যাক্স ওয়াটারম্যান এটি \ বনাম / এ উপলভ্য করার জন্য ধন্যবাদ। ঠিক কর. sedশেল স্ক্রিপ্টে যদি আপনার একটি কমান্ড থাকে, তবে আরও ব্যাকস্ল্যাশগুলির প্রয়োজন হতে পারে (প্রতিটি ব্যাকস্ল্যাশ আবার ব্যাকস্ল্যাশ করা প্রয়োজন)।
লুকোচুরি

105

sকমান্ড একটি বিভেদক কোন চরিত্র ব্যবহার করতে পারেন; যে চরিত্রটি sব্যবহারের পরে আসে । আমি ব্যবহার করার জন্য উত্থাপিত হয়েছিল #। তাই ভালো:

s#?page=one&#/page/one#g

5
ওএস এক্স-তে বিএসডি সেডের ম্যান পেজটি এস কমান্ড সম্পর্কে বলে: প্যাটার্ন স্পেসে নিয়মিত প্রকাশের প্রথম উদাহরণের জন্য প্রতিস্থাপন স্ট্রিংটি প্রতিস্থাপন করুন। ব্যাকস্ল্যাশ বা নিউলাইন ব্যতীত অন্য কোনও অক্ষর আরইএস এবং প্রতিস্থাপনের সীমানা ছাড়ানোর জন্য স্ল্যাশের পরিবর্তে ব্যবহার করা যেতে পারে। আমি অর্থের সাথে বাজি ধরব যে জিএনইউ সেডের জন্য ম্যান পেজটি অনুরূপ কিছু বলে।
টম অ্যান্ডারসন

বর্তমান গৃহীত উত্তরটি মূলত এটির মতই এবং এক মিনিট আগে পোস্ট করা হয়েছিল!
টম অ্যান্ডারসন

61

সেড সম্পর্কে একটি খুব দরকারী তবে স্বল্প-পরিচিত তথ্যটি হ'ল পরিচিত s/foo/bar/কমান্ড কেবল কোনও বিরামচিহ্নই নয়, কোনও বিরামচিহ্ন ব্যবহার করতে পারে। একটি সাধারণ বিকল্প হ'ল s@foo@bar@, যা থেকে আপনার সমস্যার সমাধান কীভাবে তা স্পষ্ট হয়ে যায়।


জেনিয়াস পরামর্শ যখন আপনি ফরোয়ার্ড স্ল্যাশ বিকল্প করতে চান। ধন্যবাদ!
এমবিবি

9

বিশেষ অক্ষরের আগে যোগ করুন:

s/\?page=one&/page\/one\//g

প্রভৃতি


4
আমি কিছু মিস করেছি, তবে আমি এটি চেষ্টা করেছি এবং দেখে মনে হচ্ছে এটি কাজ করে না। এটি চেষ্টা করার মতো সুস্পষ্ট জিনিস বলে মনে হয়েছিল, তবে ধরে নিচ্ছি যে আমি ঠিক আছি এবং এটি সত্যই কার্যকর হয় না, কেন এটি পোস্ট করবেন?
কোডেনুব

4
@ কোডেনুব (এবং অন্য যে কেউ এখানে আসেন) - শুরুতে 'গুলি' দরকার। s/foo\/bar/foo_bar/কাজ করবে, কিন্তু /foo\/bar/foo_bar/করবে না
মায়োনকস্পিট

5

যে সিস্টেমে আমি বিকাশ করছি, সেড দ্বারা প্রতিস্থাপন করা স্ট্রিংটি কোনও ব্যবহারকারীর ইনপুট পাঠ্য যা ভেরিয়েবেলে সংরক্ষণ করা হয় এবং সেডে স্থানান্তরিত হয়।

যেমনটি আগে এই পোস্টে উল্লিখিত হয়েছে, যদি সেড কমান্ড ব্লকের মধ্যে থাকা স্ট্রিংটিতে সেড দ্বারা ব্যবহৃত প্রকৃত ডিলিমিটার থাকে - তবে সেড সিনট্যাক্স ত্রুটিতে সমাপ্ত হয়। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

এইটা কাজ করে:

$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345

এটি বিরতি:

$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'

আমার ক্ষেত্রে ডিফল্ট ডিলিমিটারটি প্রতিস্থাপন করা শক্ত সমাধান নয় কারণ আমি ব্যবহারকারীকে ডেলিফিমার হিসাবে যেমন নির্দিষ্ট অক্ষরে প্রবেশ করা থেকে সীমাবদ্ধ করতে চাইনি (যেমন "/"))

যাইহোক, ইনপুট স্ট্রিংয়ে ডিলিমিটারের যেকোন ঘটনা এড়ানোর ফলে সমস্যার সমাধান হবে। সিড দ্বারা পার্স করার আগে ইনপুট স্ট্রিংয়ের মধ্যে ডিলিমিটার চরিত্রটি নিয়মিতভাবে পালানোর নীচের সমাধানটি বিবেচনা করুন। এ জাতীয় পলায়নকে সেড নিজেই ব্যবহার করে প্রতিস্থাপন হিসাবে প্রয়োগ করা যেতে পারে, ইনপুট স্ট্রিংটিতে ডিলিমিটার থাকলেও এই প্রতিস্থাপনটি নিরাপদ - এটি ইনপুট স্ট্রিংটি সেড কমান্ড ব্লকের অংশ না হওয়ায়:

$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6

আমি এটি বিভিন্ন স্ক্রিপ্ট দ্বারা ব্যবহৃত একটি ফাংশনে রূপান্তরিত করেছি:

escapeForwardSlashes() {

     # Validate parameters
     if [ -z "$1" ]
     then
             echo -e "Error - no parameter specified!"
             return 1
     fi

     # Perform replacement
     echo ${1} | sed -e "s#/#\\\/#g"
     return 0
}

1
আমার জন্য আপনার উত্তরটি সরিয়ে ফেলতে হবে, আপনি যদি ডিএএফ_ভ্যালু প্রতিস্থাপন করার জন্য যে ভ্যালুটি ব্যবহার করছেন, যদি এতে ফটোগুলি ছড়িয়ে পড়ে থাকে তবে আপনাকে VALUE="01\\\/01\\\/2018"
সেড

3

এই লাইনটি আপনার 3 টি উদাহরণের জন্য কাজ করা উচিত:

sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
  • আমি -rকিছু পালাতে বাঁচাতে ব্যবহৃত ।
  • আপনার এক, দুই তিনটি ক্ষেত্রে লাইনটি জেনেরিক হওয়া উচিত। আপনাকে উপ 3 বার করতে হবে না

আপনার উদাহরণ দিয়ে পরীক্ষা (a.txt):

kent$  echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three


1

অজ্ঞাতনামা থেকে দুর্দান্ত উত্তর। HTML আমি যখন এইচটিএমএল স্ট্রিংয়ের উদ্ধৃতিগুলি এড়াতে চেষ্টা করেছি তখন আমার সমস্যার সমাধান করে।

সুতরাং আপনি যদি কিছু এইচটিএমএল টেম্পলেট (সার্ভারে) ফেরত দেওয়ার জন্য সেড ব্যবহার করেন তবে এককটির পরিবর্তে ডাবল ব্যাকস্ল্যাশ ব্যবহার করুন:

var htmlTemplate = "<div style=\\"color:green;\\"></div>";

1

sedহয় গুলি tream ইডি itor , যে আপনি ব্যবহার করতে পারেন |পাঠাতে (নল) মান স্ট্রিম মাধ্যমে (stdin এবং stdout- এ বিশেষভাবে) sedএবং তাদের ফ্লাইটে প্রোগ্রামেটিক্যালি পরিবর্তন, এটা ইউনিক্স দর্শন ঐতিহ্য একটি কুশলী হাতিয়ার তৈরির; তবে -iনীচে উল্লিখিত প্যারামিটারটি ব্যবহার করে সরাসরি ফাইলগুলি সম্পাদনা করতে পারে ।
নিম্নলিখিত বিবেচনা করুন :

sed -i -e 's/few/asd/g' hello.txt

s/এরfew সাথে প্রাপ্ত অভিব্যক্তিটি প্রতিস্থাপন করতে ব্যবহৃত হয় asd:

কয়েক, সাহসী।


আসাদ, সাহসী।

/g"গ্লোবাল" এর অর্থ দাঁড়ায়, পুরো লাইনের জন্য এটি করা। আপনি যদি /g( ছেড়ে দিয়ে থাকেন s/few/asd/তবে সর্বদা তিনটি স্ল্যাশ হওয়া দরকার না কেন) এবং fewএকই লাইনে দু'বার উপস্থিত হলে কেবল প্রথমটিতে fewপরিবর্তিত হবে asd:

কয়েক জন পুরুষ, কয়েকজন মহিলা, সাহসী।


আসাদ পুরুষ, কয়েকজন মহিলা, সাহসী।

এটি কিছু পরিস্থিতিতে কার্যকর যেমন লাইনগুলির শুরুতে বিশেষ অক্ষরগুলি পরিবর্তনের জন্য (উদাহরণস্বরূপ, কিছু লোক ইমেল থ্রেডগুলিতে পূর্বের উপাদানগুলিকে একটি অনুভূমিক ট্যাব দিয়ে উদ্ধৃত করার সময় লাইনের পরে উদ্ধৃত বীজগণিত বৈষম্যকে রেখে দেয় অচ্ছুত), তবে আপনার উদাহরণে যেখানে আপনি নির্দিষ্ট করেছেন যে কোথাও few ঘটছে এটি প্রতিস্থাপন করা উচিত, নিশ্চিত হয়ে নিন যে এটি আপনার কাছে রয়েছে /g

নিম্নলিখিত দুটি বিকল্প (পতাকা) এক সাথে সংযুক্ত করা হয়েছে -ie:

-iঅপশনটি ফাইলটিতে আই এন এডিট করতে ব্যবহৃত হয় hello.txt

-eএই ক্ষেত্রে ই- এক্সপ্রেশন / কমান্ডটি ইঙ্গিত করে s/

দ্রষ্টব্য: -i -eআপনি অনুসন্ধান / প্রতিস্থাপন করতে এটি ব্যবহার করা গুরুত্বপূর্ণ । যদি আপনি এটি করেন তবে আপনি -ie'ই' অক্ষর যুক্ত প্রতিটি ফাইলের একটি ব্যাকআপ তৈরি করবেন।


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