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.