সেডে স্ল্যাশযুক্ত ভেরিয়েবল কীভাবে পাস করবেন


106

আপনি কীভাবে প্যাটার্ন হিসাবে স্ল্যাশযুক্ত একটি ভেরিয়েবল পাস করবেন sed?

উদাহরণস্বরূপ, আমার যদি নিম্নলিখিত পরিবর্তনশীল থাকে:

var="/Users/Documents/name/file"

আমি এটি এ sedহিসাবে পাস করতে চান :

sed "s/$var/replace/g" "$file"

তবে আমি ত্রুটি পেতে। আমি কীভাবে বিষয়টি সমাধান করতে পারি?

উত্তর:


203

sedআপনি কোনও ডিলিমিটার ( নিয়ন্ত্রণ অক্ষর সহ ) ব্যবহার করতে পারবেন হিসাবে একটি বিকল্প রেজেক্স ডিলিমিটার ব্যবহার করুন :

sed "s~$var~replace~g" $file

4
কাজ করে না। আমি sed -i "s ~ bla ~ $ var ~ g ফাইল" চেষ্টা করেছিলাম এবং পেয়েছি: "সেড-এক্স এক্সপ্রেশন # 1, চর 70: নিরবচ্ছিন্ন` s 'কমান্ড "। আমি নিশ্চিত করেছি যে অপরাধী $ var এ স্ল্যাশ। এটির সমাধানের রূপগুলি পুরো জায়গা জুড়ে এবং সেগুলির কোনওটিই কাজ করে না। সেড সম্প্রতি আপডেট হয়েছিল? আমি উবুন্টু 14.04.4 এলটিএসে v4.2.2 এ আছি।
পল এরিকসন

এটি নির্ভর করে যে এর মূল্য কী$var
অনুভভা

4
@ পলেরিক্সন পর্যবেক্ষণে with এর সাথে কাজ করে না তবে এখনও | এর সাথে কাজ করে
কেনি হো

4
সর্বশেষ "~" (
ছের

4
আপনি আমার দিনটি সংরক্ষণ করেছেন
user7131571

65

একটি খাঁটি বাশ উত্তর: ভেরিয়েবলের কোনও স্ল্যাশ ব্যাকস্ল্যাশ-এ্যাস্ক করতে প্যারামিটার সম্প্রসারণ ব্যবহার করুন :

var="/Users/Documents/name/file"
sed "s/${var//\//\\/}/replace/g" $file

4
এটি একটি ভাল উপায়, কারণ আপনি সবসময় জানেন না কী কী অক্ষরে ভেরিয়েবল থাকে। সুতরাং যদি সন্দেহ থাকে তবে আপনি সর্বদা সেড ডিলিমিটারটি এড়াতে পারবেন instance উদাহরণস্বরূপ: সেড "গুলি: // {ভার //: / \\:}: প্রতিস্থাপন: জি" $ ফাইল
স্টিফেন এল

সুন্দর। আমার বেশ কিছু ক্লিনার এর নামকরণের স্ক্রিপ্ট তৈরি করে।
মেঘ

আজ সুন্দর কিছু শিখেছি, আপনাকে ধন্যবাদ। গ্রহণযোগ্য উত্তর হওয়া উচিত।
স্টিভ কেহলেট 26'18

8
উপর প্যাটার্ন হচ্ছে কিছু স্বচ্ছতা এখানে ব্যবহৃত: ${parameter/pattern/string}। সুতরাং, এই ক্ষেত্রে, প্যারামিটারটি হয় var, প্যাটার্নটি হয় /\/এবং স্ট্রিংটি হয় \\/। প্যাটার্নটির সমস্ত উদাহরণ প্রতিস্থাপন করা হয়েছে কারণ প্যাটার্নটি a দিয়ে শুরু হয় /
জোশ

4
@ জোশ, এবং তাই প্যাটার্নের শীর্ষস্থানীয় স্ল্যাশ বাস্তবে প্রতিস্থাপনের প্যাটার্নের অংশ নয়।
গ্লেন জ্যাকম্যান

33

এটি করার আরও একটি উপায়, যদিও অনুবাবের জবাবের চেয়ে খারাপ না হলেও, varঅন্য sedকমান্ড ব্যবহার করে সমস্ত পিছনে ফেলে পালিয়ে যাওয়া :

var=$(echo "$var" | sed 's/\//\\\//g')

তাহলে, এটি কাজ করবে:

sed "s/$var/replace/g" $file

12

/বদলাকার হিসাবে সেডে ব্যবহার করা বিকল্পের পরিবর্তে ভেরিয়েবলের স্ল্যাশের সাথে বিরোধ করবে এবং ফলস্বরূপ আপনি একটি ত্রুটি পাবেন। এটিকে রোধ করার একটি উপায় হ'ল আরেকটি ডিলিমিটার ব্যবহার করা যা সেই ভেরিয়েবলের যে কোনও অক্ষর থেকে স্বতন্ত্র।

var="/Users/Documents/name/file"

আপনি অক্টথরপে চরিত্রটি ব্যবহার করতে পারেন যা উপলক্ষে উপযুক্ত (বা অন্য কোনও চরিত্র যা /ব্যবহারের সুবিধার্থে নয় )

sed "s#$var#replace#g" 

বা

sed 's#$'$var'#replace#g'

ভেরিয়েবলের স্পেস না থাকলে এটি উপযুক্ত

বা

sed 's#$"'$var'"#replace#g'

উপরেরটি ব্যবহার করা বুদ্ধিমান যেহেতু পুরো কমান্ডের ডাবল উদ্ধৃতি তুলনায় কেবলমাত্র সেই চলকটিতে যা আছে তা প্রতিস্থাপনে আমরা আগ্রহী যা শেলকে বিশেষ শেল চরিত্র হিসাবে বিবেচিত হতে পারে এমন কোনও অক্ষরকে আপনার শেলকে বাধা দিতে পারে।


কাজ করে না। আমি sed -i "s ~ bla ~ $ var ~ g ফাইল" চেষ্টা করেছিলাম এবং পেয়েছি: "সেড-এক্স এক্সপ্রেশন # 1, চর 70: নিরবচ্ছিন্ন` s 'কমান্ড "। আমি নিশ্চিত করেছি যে অপরাধী $ var এ স্ল্যাশ। এটির সমাধানের রূপগুলি পুরো জায়গা জুড়ে এবং সেগুলির কোনওটিই কাজ করে না। সেড সম্প্রতি আপডেট হয়েছিল? আমি উবুন্টু 14.04.4 এলটিএসে v4.2.2 এ আছি।
পল এরিকসন

@ পোলারিক্সসন আমার কাছে উপলভ্য কোনও উবুন্টুতে আমি এটির প্রতিবেদন করতে অক্ষম। যদি $varএতে থাকে তবে আপনার ~অবশ্যই আলাদা আলাদা সীমানা বাছাই করা দরকার। "নির্বিঘ্নিত" ত্রুটি শোনায় আপনার $varমধ্যে একটি নতুন লাইন রয়েছে; আপনি মানটির প্রতিটি নিউলাইন ব্যাকস্ল্যাশ-পলায়নের মাধ্যমে এটি সংশোধন করতে সক্ষম হতে পারেন, তবে আমি এটি পুরোপুরি পোর্টেবল মনে করি না। এটি হ'ল এবং মানটিতে স্ল্যাশ সমস্যার সাথে সম্পর্কিত নয়।
ট্রিপলি

@ পোলারিক্সন ওহ এবং আপনার উদ্ধৃতিটি ভুল, আপনার উদ্ধৃতিতে ফাইলের নাম থাকা উচিত নয়। sed -i "s~blah~$var~g" fileকেবল আসল sedস্ক্রিপ্টের চারপাশে উদ্ধৃতি সহ ।
ট্রিপলি

5

এটি একটি পুরানো প্রশ্ন, তবে এখানে উত্তরগুলির s/from/to/মধ্যে কোনওটিই বিশদ বিবরণ ব্যতীত অপারেশন সম্পর্কে আলোচনা করে না।

একটি sedবিবৃতি সাধারণ ফর্ম হয়

*address* *action*

যেখানে ঠিকানাটি একটি রেজেক্স ব্যাপ্তি বা একটি লাইন সংখ্যা ব্যাপ্তি হতে পারে (বা খালি, এক্ষেত্রে প্রতিটি ইনপুট লাইনে ক্রিয়া প্রয়োগ করা হয়)। উদাহরণস্বরূপ

sed '1,4d' file

4 মাধ্যমে লাইন 1 মুছবে ( ঠিকানা লাইন সংখ্যা পরিসীমা 1,4এবং কর্ম হয় dডিলিট কমান্ড); এবং

sed '/ick/,$s/foo/bar/' file

প্রথম সংঘটন প্রতিস্থাপন করবে fooসঙ্গে barRegex প্রথম ম্যাচে মধ্যে কোনো লাইনে ickএবং ফাইল শেষে ( ঠিকানা পরিসর /ick/,$এবং কর্ম হয় sবিকল্প কমান্ড s/foo/bar/)।

এই প্রসঙ্গে, যদি ickকোনও ভেরিয়েবল থেকে আসে তবে আপনি করতে পারেন

sed "/$variable/,\$s/foo/bar/"

(এককটির পরিবর্তে ডাবল উদ্ধৃতিগুলির ব্যবহার লক্ষ্য করুন, যাতে শেলটি ভেরিয়েবলটি ইন্টারপোলেট করতে পারে, এবং ডাবল কোটের ভিতরে আক্ষরিক ডলার চিহ্নটি উদ্ধৃত করার প্রয়োজনীয়তা হয়) তবে যদি ভেরিয়েবলটিতে স্ল্যাশ থাকে তবে আপনি একটি বাক্য গঠন ত্রুটি পাবেন। (শেলটি ভেরিয়েবলটি প্রসারিত করে, এরপরে ফলাফলটি স্ট্রিংটি এতে প্রবাহিত করে sed; সুতরাং sedকেবল আক্ষরিক পাঠ্যই দেখে - এতে শেলের ভেরিয়েবলগুলির কোনও ধারণা নেই))

নিরাময়টি হ'ল আলাদা ডিলিমিটার ব্যবহার করা (যেখানে স্পষ্টতই আপনাকে এমন একটি অক্ষর ব্যবহার করতে সক্ষম হতে হবে যা ভেরিয়েবলের মান হতে পারে না) তবে এর বিপরীতে s%foo%bar%, যদি আপনি অন্যটি ব্যবহার করতে চান তবে আপনারও ডিলিমেটারের আগে একটি ব্যাকস্ল্যাশ প্রয়োজন you ডিফল্টের চেয়ে সীমানা /:

sed "\\%$variable%,\$s/foo/bar/" file

(একক উদ্ধৃতিগুলির ভিতরে, একটি একক ব্যাকস্ল্যাশ স্পষ্টতই যথেষ্ট হবে); অথবা আপনি প্রতিটি স্ল্যাশ পৃথকভাবে মূল্য থেকে পালাতে পারেন। এই নির্দিষ্ট বাক্য গঠনটি কেবলমাত্র বাশ:

sed "/${variable//\//\\/}/,\$s/foo/bar/" file

অথবা আপনি যদি অন্য শেল ব্যবহার করেন তবে চেষ্টা করুন

escaped=$(echo "$variable" | sed 's%/%\\/%g')
sed "s/$escaped/,\$s/foo/bar/" file

স্পষ্টতার জন্য, যদি $variableস্ট্রিংটি থাকে 1/2তবে উপরের কমান্ডগুলির সমতুল্য হবে

sed '\%1/2%,$s/foo/bar/' file

প্রথম ক্ষেত্রে, এবং

sed '/1\/2/,$s/foo/bar/' file

দ্বিতীয় মধ্যে।


4

পার্ল ব্যবহার করুন, যেখানে ভেরিয়েবলগুলি প্রথম শ্রেণির নাগরিক, কেবল ম্যাক্রোগুলি প্রসারিত করে না:

var=/Users/Documents/name/file perl -pe 's/\Q$ENV{var}/replace/g' $file
  • -p লাইন দ্বারা ইনপুট লাইন পড়ে এবং প্রক্রিয়া করার পরে লাইনটি মুদ্রণ করে
  • \Qনিম্নলিখিত স্ট্রিংয়ে সমস্ত মেটাচার্যাক্টরকে উদ্ধৃত করে (এখানে উপস্থাপিত মানের প্রয়োজন হয় না তবে মানটি অন্তর্ভুক্ত থাকে [বা নিয়মিত এক্সপ্রেসিসনের জন্য বিশেষ কিছু অন্যান্য মান রয়েছে)

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