बैश 4.3 ओएस एक्स पर नकारात्मक लंबाई को प्रतिस्थापित करता है


12

बैश 4.2 ने नकारात्मक सबस्ट्रिंग लंबाई के लिए समर्थन जोड़ा:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

उदाहरण 37-12। स्ट्रिंग-निष्कर्षण निर्माण में नकारात्मक पैरामीटर

जब "लंबाई" पैरामीटर नकारात्मक होता है, तो यह ऑफ़सेट-एंड-एंड पैरामीटर के रूप में कार्य करता है।

उदाहरण के लिए, निम्न आउटपुट "विश्व" जब उबंटू पर परीक्षण किया जाता है:

STR="Hello World!"
echo ${STR:6:-1}

लेकिन OS X (GNU बैश, संस्करण 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)) में, यह उपयोग निम्न त्रुटि उत्पन्न करता है:

-1: substring expression < 0

क्या यह ओएस एक्स विशिष्ट है, या इसे बाद के बैश अपडेट में फिर से अक्षम किया गया था? क्या ओएस एक्स के लिए इस कार्यक्षमता को सक्षम करने का एक तरीका है?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - v2, v3 और v4 के साथ शुरू होने पर क्या जोड़ा गया था।
हन्नू

@ हनु हां, उस दस्तावेज़ का कहना है कि नकारात्मक लंबाई के शब्दार्थ को 4.2 संस्करण में जोड़ा गया था
ब्रेंट फॉस्ट

मेरे पास एक ही मुद्दा है: क्या आपको इससे निपटने का कोई तरीका मिला?
रोमेन जौइन

@romainjouin बस एल्गोरिथ्म को बदलकर। यह सिंटैक्स सिर्फ ओएक्स एक्स के तहत काम नहीं करता है, यहां तक ​​कि बैश संस्करण 4.3.46 के रूप में भी! इस पर अधिक आँखें प्राप्त करने की कोशिश करने के लिए सवाल को वोट करें। किसी को जवाब पता है ...
ब्रेंट फस्ट

1
@Rubistro बस इसे मारो: | इसके चारों ओर एक रास्ता है (आपके उदाहरण में)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

जवाबों:


7

जबकि फ्लैबडेबिलिटी का समाधान केवल निश्चित लंबाई के तारों के लिए काम करता है आप इसे गतिशील आकार के तारों के लिए ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग कर सकते हैं:

echo ${STR:6:$((${#STR} - 6 - 1))}

विस्तार से:

  • ${#STR} स्ट्रिंग की लंबाई देता है।
  • $((a - b - c)) गणितीय घटाव करता है
  • ${STR:start:len} एक विकल्प देता है।

इसलिए दूसरी दलील को संयुक्त अभिव्यक्ति में जोड़ दिया गया है, स्ट्रिंग की लंबाई शून्य से शुरू होने वाले ऋण का मान है जिसे आप नए बैश के सिंटैक्स में नकारात्मक मान के रूप में निर्दिष्ट करेंगे।


2

$ {STR: 6: $ {# STR} -7} $ {STR: 6: -1} के लिए एक काम करने वाली ड्रॉप-रिप्लेसमेंट होनी चाहिए, अगर STR में कम से कम 7 अक्षर रखने की गारंटी हो। यदि यह छोटा हो सकता है, तो इससे OS X बैश को नकारात्मक लंबाई के बारे में शिकायत करने का मौका मिलेगा, या bash संस्करणों पर बुरी तरह से गलत हो जाएगा, जो कि नकारात्मक लंबाई से-ऑफ-राइट ऑफ़सेट के रूप में लिया जा रहा है।


Thx, मेरे लिए चाल
जीन-बर्नार्ड जानसेन

0

यहाँ से गुगली :

वे कहते हैं कि ${STR:6:$#-1}अच्छा काम करना चाहिए

मेरे मामले में, एक समान त्रुटि के साथ ${VERSION::-2}, बस 0 को इस तरह से जोड़ने के बाद काम करना शुरू हो गया ${VERSION:0:-2}:।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.