मैं पहली सी अक्षर से स्ट्रिंग का उपयोग करके कैसे पट्टी कर सकता हूं?


126

मैं एक छोटे से औद्योगिक बॉक्स में एम्बेडेड लिनक्स के लिए शेल स्क्रिप्ट लिख रहा हूं। मेरे पास पाठ वाला एक चर है pid: 1234और मैं पहले X अक्षर को लाइन से अलग करना चाहता हूं, इसलिए केवल 1234 रहता है। मेरे पास अधिक चर हैं जिन्हें मुझे "साफ" करने की आवश्यकता है, इसलिए मुझे एक्स पहले पात्रों को दूर करने की आवश्यकता है और ${string:5}मेरे सिस्टम में किसी कारण से काम नहीं करता है।

बॉक्स के लिए केवल एक चीज है लगता है sed

मैं निम्नलिखित काम करने की कोशिश कर रहा हूं:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

कोई विचार?


10
यदि आप ${string:5}काम नहीं करते हैं तो आप बैश या किसी अन्य शेल का उपयोग नहीं कर रहे हैं जो उस सिंटैक्स का समर्थन करता है। आप किस शेल और संस्करण का उपयोग कर रहे हैं? आपका शेबंग कैसा दिखता है? मेरा अनुमान है कि आप sh(जैसे dash) या संभवतः उपयोग कर रहे हैं zsh
अगली सूचना तक रोक दिया गया।

जवाबों:


0

यह काम भी करेगा:

echo "$pid"|awk '{print $2}'

27
यह प्रश्न "स्ट्रिंग में पहले एन वर्ण छोड़ें" के लिए पहली हिट है। आपने सवाल का जवाब नहीं दिया।
jww

यह काम करने के लिए प्रतीत नहीं होता है, और अगर यह होता है, तो क्या आप समझा सकते हैं कि कैसे
अलेक्जेंडर मिल्स

यह मेरे सिस्टम पर काम करता है। आपके क्षेत्र विभाजक के साथ कोई समस्या हो सकती है, प्रयास करें awk -F": " '{print $2}'। फिर भी, मेरा पसंदीदा समाधान नहीं।
mzuther

197

निम्नलिखित काम करना चाहिए:

var="pid: 1234"
var=${var:5}

क्या आप सुनिश्चित हैं कि bashशेल आपकी स्क्रिप्ट को निष्पादित कर रहा है?

यहां तक ​​कि POSIX- शिकायत भी

var=${var#?????}

एक बाहरी प्रक्रिया का उपयोग करने के लिए बेहतर होगा, हालांकि इसके लिए आपको 5-निश्चित पैटर्न के रूप में हार्ड-कोड की आवश्यकता होती है।


1
आप दूसरे पैरामीटर के साथ लंबाई भी निर्दिष्ट कर सकते हैं: ${var:5:2}पर शुरू होगा 1और वापस लौटेगा 12
मैक्स कैंडोसिया

108

यहाँ पहले एक्स अक्षर का उपयोग करने के लिए एक संक्षिप्त विधि है cut(1)। यह उदाहरण 5 वें चरित्र से शुरू होने वाले एक विकल्प को काटकर पहले 4 वर्णों को हटा देता है।

echo "$pid" | cut -c 5-

2
यह सबसे सरल उपाय है!
ब्रैंडन

2
तकनीकी तौर पर ओपी ने सीड के लिए कहा, लेकिन मुझे ऐसा लगता है कि "स्ट्रिंग से [पहले एक टर्मिनल / बैश में] मैं कैसे एक्स एक्स वर्णों को स्ट्रिप कर सकता हूं" के लिए यह सबसे अच्छा समाधान है। जब git के साथ संयोजन में उपयोग किया जाता है, तो यह अच्छा है:git log --pretty=oneline | cut -c 42- | head
marksiemers

1
+1 सरल और सहायक समाधान .. जब मेरे पास http: // <example.com> के रूप में URL था और प्रोटोकॉल 'http: //' को काटने के लिए मुझे 7. के बजाय 8 वर्णों के रूप में कहना होगा, मुझे नहीं पता , लेकिन यह है कि यह मेरे लिए कैसे काम किया।
संतोष कुमार अर्जुनन

1
संतोष कुमार अर्जुनन: ऐसा इसलिए है क्योंकि उदाहरण "गूंज" $ pid "है। कट -c 4-" वास्तविक रूप से पहले 4 वर्णों को नहीं काट रहा है, लेकिन 4 वर्ण से शुरू होने वाले अर्क को प्रतिस्थापित करता है। इसलिए यह वास्तव में पहले 3 पात्रों को काटता है। इस प्रकार, यदि आप 7 प्रथम वर्णों को काटना चाहते हैं, तो आप 8 वें वर्ण से सब कुछ निकालना चाहते हैं और इस प्रकार वास्तव में "कट -c 8-" करते हैं
अल-

1
@DeanHiller cut -c ${LEN}-। घुंघराले ब्रेसिज़ का उपयोग वैरिएबल वेरिएबल कैरेक्टर के साथ स्ट्रिंग को कंसट्रेट करने के लिए किया जाता है, ताकि यह डिफरेंट किया जा सके कि वेरिएबल क्या है और क्या नहीं। यदि आप इस पर अधिक जानकारी चाहते हैं, तो यह क्यों / कैसे काम करता है, इस बारे में अधिक संसाधनों के लिए "बैश वैरिएबल स्ट्रिंग कंसंट्रेशन" देखें।
जस्टकार्टी

46

का प्रयोग करें -rविकल्प को ( "उपयोग लिपि में नियमित अभिव्यक्ति बढ़ाया") sedका उपयोग करने के क्रम में {n}वाक्य रचना:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

1
अगर मैं एक स्ट्रिंग से अंतिम X अक्षर निकालना चाहूंगा, तो यह कैसे होगा?
कोकेश

5
@ कोकेश: आप sed -r 's/.{5}$//'इसके बजाय अंतिम 5 अक्षरों को छीन सकते हैं
मार्क लॉन्गेयर

7
आप इसे -r( बिना -EOS X, IIRC) के कर सकते हैं यदि आप ब्रेसिज़ से बच जाते हैं (यह नहीं जानते कि यह OS X में काम करता है, हालाँकि)।
अगली सूचना तक रोक दिया गया।

2
@ डेनिस: मैंने अभी-अभी ब्रेक्स से बचकर ( ओएस को छोड़कर -r/ -E) ओएस एक्स में काम किया है।
गॉर्डन डेविसन

15

स्ट्रिंग से पहले दो अक्षर काटें:

$ string="1234567890"; echo "${string:2}"
34567890

@ dtp70 बहुत धन्यवाद एक सामान्य जवाब, यह बहुत अच्छा काम किया!
वुल्फराम w

10

पाइप के माध्यम से awk '{print substr($0,42)}'जहां 42 को छोड़ने के लिए वर्णों की संख्या से एक अधिक है। उदाहरण के लिए:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

8

संभावना है, आपके पास cutभी होगा। यदि ऐसा है तो:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

1
इसके साथ परेशानी cutयह है कि यह व्हाट्सएप के दृश्यों को समझदारी से नहीं संभालता है, tr -s ' '"निचोड़" रिक्त स्थान का उपयोग करने से यह बेहतर व्यवहार करता है।
थोर

1
इसका मतलब यह नहीं है कि सभी गायन के सभी नृत्य उपकरण हैं; यह सरल है और यह कैन पर कहता है और व्यापक रूप से उपलब्ध है। यह उक्त आवश्यकताओं के लिए ठीक काम करना चाहिए, और निश्चित रूप से अधिक मजबूत है कि विशिष्ट पदों से निश्चित वर्णों को काटकर अलग कर दें।
शॉन चिन

5

ठीक है, समाधान के साथ यहाँ किया गया है sed, awk, cutऔर का उपयोग कर bashवाक्य रचना। मैं सिर्फ एक और पोसिक्स अनुरूप संस्करण में फेंकना चाहता हूं:

$ echo "pid: 1234" | tail -c +6
1234

-cटेल को बताता है कि इनपुट डेटा के अंत से गिनती शुरू करने के लिए कौन सी बाइट ऑफसेट है, फिर भी यदि संख्या एक +संकेत के साथ शुरू होती है , तो यह इनपुट डेटा की शुरुआत से अंत तक है।


4

एक और तरीका है, के cutबजाय का उपयोग कर sed

result=`echo $pid | cut -c 5-`

वह पहले 4 पात्रों को निकालना चाहता है। इसे पहले 4 अक्षर मिलते हैं।
एम.एम.

2

मुझे इस प्रश्न द्वारा आपूर्ति की गई शुद्ध सेड में उत्तर मिला (वास्तव में , इस प्रश्न के बाद पोस्ट किया गया था)। यह वही है जो आपने पूछा था, केवल sed में:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

डॉट इन sed '/./) जो भी आप मैच करना चाहते हैं। आपका प्रश्न ठीक वही है जो मैं करने का प्रयास कर रहा था, मेरे मामले को छोड़कर मैं एक फ़ाइल में एक विशिष्ट लाइन से मेल खाना चाहता था और फिर इसे अनलॉम्ब कर रहा था। मेरे मामले में यह था:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

-iके बाद sedसंपादित करने के लिए जगह में फ़ाइल (इस स्विच को दूर आपके द्वारा संपादित फ़ाइल करने से पहले अपने मिलान अभिव्यक्ति का परीक्षण करना चाहते हैं) है।

(मैंने इसे पोस्ट किया क्योंकि मैं इसे पूरी तरह से sed के साथ करना चाहता था क्योंकि यह प्रश्न पूछा गया था और पिछले उत्तर में से किसी ने भी उस समस्या को हल नहीं किया है।)


1

शुरू से n अक्षर हटाने के बजाय, शायद आप सीधे अंकों को निकाल सकते हैं। इस तरह...

$ echo "pid: 1234" | grep -Po "\d+"

यह अधिक मजबूत समाधान हो सकता है, और अधिक सहज लगता है।

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