मैं दो विशिष्ट पात्रों के बीच स्ट्रिंग कैसे प्राप्त कर सकता हूं, केवल बैश में [grep या sed का उपयोग किए बिना]

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

input=hostname~web:sit

मैं उपरोक्त इनपुट से web निकालना चाहता हूं

${hostname#*~} मुझे web:sit के रूप में आउटपुट देता है, लेकिन मुझे आउटपुट में केवल web की आवश्यकता है

दूसरी पोस्ट से मैं देख सकता हूँ

% strips from end of $var, पैटर्न तक। लेकिन यह सुनिश्चित नहीं है कि इसे कैसे लागू किया जाए।

कृपया कोई मदद करें

2
upog 24 मार्च 2021, 22:24

3 जवाब

सबसे बढ़िया उत्तर

bash में extglob का उपयोग करके, आप इसे एकल चरण में कर सकते हैं:

shopt -s extglob
input='hostname~web:sit'
echo "${input//@(*~|:*)/}"

web

यहां @(*~|:*) शुरुआत से ~ वर्ण या : से अंत तक एक सबस्ट्रिंग से मेल खाता है। // का उपयोग करके हम ऐसे सभी उदाहरणों को एक खाली स्ट्रिंग से बदल देते हैं।


एक sed समाधान भी है:

sed -E 's/.*~([^:]+):.*/\1/' <<< "$input"

web
2
anubhava 24 मार्च 2021, 23:04

इसे दो चरणों में करें:

input=hostname~web:sit

rightpart=${input#*~}   # remove prefix up to "~" (included)
output=${rightpart%:*}  # remove suffix from ":" (included)

echo $output
2
Pierre François 24 मार्च 2021, 22:36

एक अन्य विकल्प, cut का उपयोग करना जो उपलब्ध है GNU कोर यूटिलिटीज से:

  1. सभी पीछे ~ प्राप्त करें
  2. सभी पहले : प्राप्त करें
input='hostname~web:sit'
echo "$input" | cut -d '~' -f2 | cut -d ':' -f1
# web

इसे ऑनलाइन आज़माएं!

1
0stone0 24 मार्च 2021, 23:35