সেড "অজানা বিকল্পের` s '"ত্রুটির সাথে ব্যর্থ হয়


158

আমি ব্যবহার করার চেষ্টা করছি

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

তবে আমি এই ত্রুটি পেয়েছি:

sed: -e expression #1, char 34: unknown option to `s'

কেন এটি পুরোপুরি কাজ করে তা আমি বুঝতে পারি না:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

আমি কী ভুল করছি সে সম্পর্কে কোনও ধারণা?

এটা কি সমস্যা হতে পারে? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
* BSD ত্রুটি বার্তা (ওএসএক্স সহ) হ'ল "বিকল্প কমান্ডে খারাপ পতাকা:" - এটি কিছুটা আরও গুগলযোগ্য করার জন্য এটি এখানে অন্তর্ভুক্ত করে।
ট্রিপল

উত্তর:


355

সমস্যাটি স্ল্যাশগুলির সাথে রয়েছে: আপনার পরিবর্তনশীলগুলি সেগুলি ধারণ করে এবং চূড়ান্ত কমান্ডটি এমন কিছু হবে যাতে sed "s/string/path/to/something/g"অনেকগুলি স্ল্যাশ থাকে।

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

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

মনে রাখবেন এটি বুলেট প্রুফ নয়: যদি প্রতিস্থাপনের স্ট্রিং পরে থাকে তবে @এটি একই কারণে ভেঙে যায় এবং কোনও ব্যাকস্ল্যাশ ক্রমগুলি \1এখনও sedনিয়ম অনুসারে ব্যাখ্যা করা হবে । |পাঠ্যযোগ্যতার ক্ষেত্রে অনুরূপ হিসাবে ডিলিমিটার হিসাবে ব্যবহার করাও একটি দুর্দান্ত বিকল্প /


38
ভবিষ্যতের ব্যবহারকারীদের সহায়তা করার জন্য কেবল একটি নোট, যেমন আমি এই উত্তরটি সহায়ক হিসাবে পেয়েছি। আসল পোস্টারটিতে সম্ভবত তার প্রতিস্থাপনের কিছু ছিল (সম্ভবত ভেরিয়েবলের মধ্যে লুকানো ছিল) যাতে সামনের দিকে স্ল্যাশ ছিল। এই স্ল্যাশগুলির মধ্যে প্রথমটির মুখোমুখি হওয়ার পরে সেড প্রতিস্থাপনটি সমাপ্ত বলে বিবেচনা করে এবং এরপরে যা কিছু আসে তার বিকল্প হিসাবে (যেমন g)।
ব্রায়ান ওয়ারশওয়া

4
সুন্দরভাবে সম্পন্ন (ভেরিয়েবল এক্সপ্রেশন মোড়ানো মনে রাখবেন অন্যথায় "নয় :) এর সামগ্রীর পরিবর্তে আপনি আপনার শেষ '$content$content

1
@ অ্যাবস্ট্রাক্ট ডিসসনেন্স সম্ভবত আপনি যদি কোনও পাসওয়ার্ড বা অদ্ভুত বা এলোমেলো কিছু প্রতিস্থাপন করছেন তবে তাতে এখনও @ রয়েছে have আপনাকে অবশ্যই এমন একটি সীমানা সন্ধান করতে হবে যা আপনার প্রতিস্থাপনের স্ট্রিংয়ে নেই in
জাভি মন্টেরো

5
@ পিপমকিন কেবল "ফরওয়ার্ড স্ল্যাশ" ডিলিমিটারগুলিকে প্রতিস্থাপন করুন: যেমন sed -i "s/../../g"বিভিন্ন চরিত্রের সাথে:: sed -i "s@...@...@g", তবে একাধিক স্ল্যাশের সমস্যাটি অদৃশ্য হয়ে যাবে। এবং যদি আপনি ব্যবহার "পরিবর্তে 'এটি করা উচিত এছাড়াও ভেরিয়েবল ভিতরে, অর্থাত সঙ্গে ভাল কাজ করে: export var1=bar; sed -i "s@foo@${var1}@g"। আরও তথ্য আপনি দারুণ সেড
এজেল

1
দেখুন info sed(: উৎস unix.stackexchange.com/questions/259083/... ): "s এর সিনট্যাক্স (বিকল্প হিসেবে) কমান্ড 'S / regexp / প্রতিস্থাপন / পতাকা' / অক্ষর অবিশেষে অন্য কোন দ্বারা প্রতিস্থাপিত হতে পারে। যে কোনও প্রদত্ত s কমান্ডের মধ্যে একক অক্ষর। "
গ্যাব্রিয়েল স্টেপলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.