2012-09-11 12 views
10

से अंतिम और पहला अक्षर स्ट्रिप करें awk/sed का उपयोग कर स्ट्रिंग से पहले और अंतिम वर्ण को पट्टी करना काफी आसान है?स्ट्रिंग

मैं इस स्ट्रिंग (1 2 3 4 5 6 7)

मैं इसे से कोष्ठक पट्टी करना चाहते हैं कहो।

मुझे यह कैसे करना चाहिए?

उत्तर

31

एसईडी रास्ता

$ echo '(1 2 3 4 5 6 7)' | sed 's/^.\(.*\).$/\1/' 
1 2 3 4 5 6 7 

awk रास्ता

$ echo '(1 2 3 4 5 6 7)' | awk '{print substr($0, 2, length($0) - 2)}' 
1 2 3 4 5 6 7 

POSIX श रास्ता

$ var='(1 2 3 4 5 6 7)'; var="${var#?}"; var="${var%?}"; echo "$var" 
1 2 3 4 5 6 7 

बैश रास्ता

$ var='(1 2 3 4 5 6 7)'; echo "${var:1: -1}" 
1 2 3 4 5 6 7 

यदि आप bash का उपयोग करते हैं तो बैश मार्ग का उपयोग करें।

यदि नहीं, तो पॉज़िक्स-शू रास्ता पसंद करें। यह sed या awk लोड करने से तेज़ है।

इसके अलावा, आप अन्य टेक्स्ट प्रोसेसिंग भी कर सकते हैं, ताकि आप इसके साथ गठबंधन कर सकें, इसलिए शेष स्क्रिप्ट के आधार पर आप अंत में sed या awk का उपयोग करके लाभ उठा सकते हैं।


क्यों यह काम नहीं करता है? sed '..' s_res.temp > s_res.temp?

यह काम नहीं करता है, क्योंकि रीडायरेक्शन > इसे पढ़ने से पहले फ़ाइल को छोटा कर देगा। इस हल करने के लिए आपको कुछ विकल्प हैं:

  1. आप वास्तव में क्या करना चाहते हैं संपादित फ़ाइल है। sed एक धारा संपादक एक फ़ाइल संपादक नहीं है।
    ed हालांकि, एक फ़ाइल संपादक (मानक भी है!) है। तो, ed का उपयोग करें:

    $ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp 
    
  2. उपयोग अस्थायी फ़ाइल, और फिर mv यह पुरानी की जगह।

    $ sed 's/^.\(.*\).$/\1/' s_res.temp > s_res.temp.temp 
    $ mv s_res.temp.temp s_res.temp 
    
  3. उपयोग sed की -i विकल्प।यह केवल, के साथ जीएनयू-sed काम करता है के रूप में -i POSIX नहीं है और GNU-केवल:

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp 
    
  4. दुरुपयोग खोल (वास्तव में अनुशंसित नहीं):

    $ (rm test; sed 's/XXX/printf/' > test) < test 
    

मैक ओएस एक्स पर (नवीनतम संस्करण 10.12 - सिएरा) bash संस्करण 3.2.57 पर अटक गया है जो काफी पुराना है। कोई भी bash को brew का उपयोग करके हमेशा स्थापित कर सकता है और संस्करण 4.x प्राप्त कर सकता है जिसमें उपर्युक्त काम करने के लिए आवश्यक प्रतिस्थापन शामिल हैं।

बैश संस्करणों और संबंधित परिवर्तन का एक संग्रह, bash-hackers wiki

+0

बहुत बढ़िया! बहुत धन्यवाद!!!!! – user1508893

+0

मुझे 'sed' का उपयोग करना पसंद है। एक सवाल, हालांकि, यह क्यों काम नहीं करता है? 'sed's/^। \ (। * \)। $/\ 1/'s_res.temp> s_res.temp'? – user1508893

+0

क्योंकि रीडायरेक्शन फ़ाइल पढ़ने से पहले फ़ाइल को छोटा कर देता है। मैं इसके लिए अपना जवाब अपडेट करूंगा। – c00kiemon5ter

0

और यह भी पर संकलित एक पर्ल तरीका नहीं है:

perl -pe 's/^.|.$//g' 
1

एक दिया स्ट्रिंग से पहले और अंतिम वर्ण निकालने के लिए, मुझे पसंद है इस sed:

:

sed -e 's/^.//' -e 's/.$//' 
#   ^^   ^^ 
# first char   last char 

एक उदाहरण देखें

sed -e 's/^.//' -e 's/.$//' <<< "(1 2 3 4 5 6 7)" 
1 2 3 4 5 6 7