"अज्ञात विकल्प के साथ" s 'त्रुटि के साथ sed विफल रहता है


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 त्रुटि संदेश (OSX सहित) "विकल्प कमांड में खराब ध्वज है:" - इसे इसमें शामिल करने के लिए इसे कुछ हद तक अधिक योग्य बनाने के लिए।
ट्रिपलए

जवाबों:


355

समस्या स्लैश के साथ है: आपके चर में उन्हें शामिल किया गया है और अंतिम कमांड कुछ ऐसा होगा sed "s/string/path/to/something/g", जिसमें बहुत अधिक स्लैश होंगे।

चूंकि sedआप किसी भी चार्ट को सीमांकक के रूप में ले सकते हैं (नए परिसीमन की घोषणा किए बिना), आप एक दूसरे का उपयोग करने का प्रयास कर सकते हैं जो आपके प्रतिस्थापन स्ट्रिंग में प्रकट नहीं होता है:

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

ध्यान दें कि यह बुलेट प्रूफ नहीं है: अगर बाद में रिप्लेसमेंट स्ट्रिंग होती है तो @यह उसी कारण से टूट जाएगी, और किसी भी बैकस्लैश सीक्वेंस की \1व्याख्या अभी भी sedनियमों के अनुसार की जाएगी। |एक सीमांकक के रूप में उपयोग करना भी एक अच्छा विकल्प है क्योंकि यह पठनीयता के समान है /


38
भविष्य के उपयोगकर्ताओं की मदद करने के लिए बस एक नोट, क्योंकि मुझे यह उत्तर उपयोगी लगा, साथ ही। मूल पोस्टर में सबसे अधिक संभावना थी कि उसके प्रतिस्थापन में कुछ (सबसे अधिक संभावना है जो चर में छिपी हुई है) जिसमें आगे का स्लैश था। पहले उन स्लैश में से एक का सामना करने के बाद, sed ने प्रतिस्थापन को समाप्त माना, और जो भी विकल्प के रूप में आया (जैसे कि g)।
ब्रायन वारशॉ

4
अच्छी तरह से किया गया (बस याद रखें कि परिवर्तनशील अभिव्यक्तियों को लपेटना "नहीं है 'अन्यथा आपको :) $contentकी सामग्री के बजाय अपने अंतिम परिणाम में बहुत कुछ मिलेगा $content)

1
@ एब्रीडिएसनेंस शायद अगर आप पासवर्ड या कुछ अजीब या रैंडम की जगह ले रहे हैं तो भी आपके पास उसमें @ मौजूद है। आपको एक सीमांकक खोजना होगा जो आपके प्रतिस्थापन स्ट्रिंग में निहित नहीं है।
ज़ावी मोंटेरो

5
@ppumkin सिर्फ "फॉरवर्ड स्लैश" सीमांकक को प्रतिस्थापित करता है जैसे:: sed -i "s/../../g"अलग-अलग वर्ण के साथ:, sed -i "s@...@...@g"फिर कई स्लैश की समस्या गायब हो जानी चाहिए। और अगर आप "इसके बजाय उपयोग करते हैं, 'तो अंदर के चर के साथ भी अच्छा काम करना चाहिए, अर्थात export var1=bar; sed -i "s@foo@${var1}@g":। अधिक जानकारी आप कमाल एसईडी प्रलेखन में पा सकते हैं: grymoire.com/Unix/Sed.html
Egel

1
देखें info sed(स्रोत: unix.stackexchange.com/questions/259083/… ): "s का सिंटैक्स (विकल्प के रूप में) कमांड 's / regexp / प्रतिस्थापन / झंडे' है। / वर्ण समान रूप से किसी अन्य द्वारा प्रतिस्थापित किया जा सकता है। किसी भी कमांड के भीतर एकल वर्ण। "
गेब्रियल स्टेपल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.