sed त्रुटि: "अमान्य संदर्भ \ 'कमांड के RHS पर"


103

मैं मावेन के लिए एक रंगीन स्क्रिप्ट के मूल के रूप में कई प्रतिस्थापन कमांड चलाता हूं । में से एक sedआदेशों के लिए रेगुलर एक्सप्रेशन जो खोल में खोज काम करता है के रूप में उपयोग करता है यहाँ पर चर्चा की । वर्तमान (काम नहीं) कार्यान्वयन यहाँ पाया जा सकता है ।

जब मैं स्क्रिप्ट में कमांड के विभिन्न रूपों में से एक को शामिल करता हूं तो अलग व्यवहार होता है:

वेरिएंट 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

स्क्रिप्ट के अनुकूल:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

त्रुटि: शेल उसी सूचना को आउटपुट करता है जैसे कि मैं टाइप करूंगा $ sed। अजीब!?


वेरिएंट 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

स्क्रिप्ट के अनुकूल:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

त्रुटि:

sed: -e अभिव्यक्ति # 7, char 59: 's' कमांड के RHS पर अमान्य संदर्भ \ 1


10
मेरे मामले में मैंने एक -i(स्थान विकल्प में संपादित करें) के साथ संयुक्त किया था -re, जिसके परिणामस्वरूप -ire(ताकि इसके तर्क के रूप -iमें reटुकड़े का उपभोग हो रहा था SUFFIXऔर इसलिए विस्तारित रेगेक्स मोड सक्षम नहीं हो रहा था); इसे -i -reमुद्दे को तय करने के लिए बदल रहा है ।
— जनक बंडारा

यह भी ध्यान रखना है कि सिंगल कोट्स 'और डबल कोट्स "को थोड़ा अलग माना जाता है, खासकर जब व्याख्या करते हुए $vars। उदाहरण के लिए: sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"काम करता है, लेकिन: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'नहीं करता है।
— नॉटआउट

जवाबों:


51

आप वास्तव में काम करने के लिए कब्जा करने की जरूरत नहीं है? 2 संस्करण के लिए यानी:

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(नोट: अप्राप्त)

-R तर्क के बिना बैक-रेफरेंस (जैसे \ 1) काम नहीं करेगा।


42
-rबैक-रेफरेंस के काम करने के लिए सेड का विकल्प आवश्यक प्रतीत होता है। ईजी sed -e 's/([[:digit:]])/is a digit/'काम करता है लेकिन sed -e 's/([[:digit:]])/\1 is a digit/बिना -rसीड के मूल त्रुटि पैदा करता है । नोट: एक शाब्दिक के लिए sed खोज के पहले मंगलाचरण (<digit>)और नहीं है एक पर कब्जा समूह।
— एंड्रयू फेलंगा

उत्तर के नीचे टिप्पणी वास्तव में एक उत्तर है। हो सकता है कि आप इसे दर्शाने के लिए अपने उत्तर को संपादित कर सकें।
— miroxlav

@AndrewFalanga आपको अपनी टिप्पणी एक जवाब के रूप में पोस्ट करनी चाहिए थी
— sanmai

2
कभी-कभी मेरी गलती उपयोग के -ireबजाय उपयोग करने की थी -ri। आदेश मामलों :-)
— m3nda

54

यह त्रुटि उन कोष्ठकों के लिए आम है जो बच नहीं रहे हैं। उनसे बचकर फिर कोशिश करें।


उदाहरण के लिए:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

प्रत्येक कोष्ठक से पहले बैकस्लैश से बच जाना चाहिए:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

6
ध्यान दें, यदि आप उपयोग -rकरते हैं तो आपको कोष्ठक से बचना नहीं है।
— १२

13

यदि -r/ --regexp-extendedविकल्प प्रदान नहीं किया गया है, तो कैप्चरिंग कोष्ठक से बच जाना चाहिए।


5

तुम भागने के /बाद की जरूरत है.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

या यदि आप बचने के बारे में चिंता नहीं करना चाहते हैं, तो उपयोग करें |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

संपादित करें:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"

उचित लगता है। लेकिन यह स्क्रिप्ट के संदर्भ में काम नहीं करता है।
— JJD

माफ़ करना। संपादन त्रुटि को बढ़ाता है sed: -e expression #7, char 58: Invalid range end:। @ डेनिस का जवाब काम करता है।
— JJD

2
ठीक है, फिर @Denis के जवाब के लिए +1
— slackmart
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.