2013-02-16 38 views
5

मैं एक अजगर स्क्रिप्ट बोल रहा हूँ, parse_input.py बैशपार्सिंग कमांड लाइन तर्क में - अजगर 2.7.3

parse_input.py से एक कमांड लाइन तर्क यह कई '\n' कैरेक्टर हैं कि लगता है।

उदाहरण इनपुट:

$ python parse_input.py "1\n2\n"

import sys 
import pdb 

if __name__ == "__main__": 

    assert(len(sys.argv) == 2) 

    data = sys.argv[1] 
    pdb.set_trace() 
    print data 

मैं pdb कि `data = "1\\n2\\n" जबकि मैं data="1\n2\n"

मैं सिर्फ \ (\n के बिना) के साथ समान व्यवहार देखा चाहते हैं पर देख सकते हैं जो \\ द्वारा बदल दिया जाता है

अतिरिक्त \ को कैसे निकालें?

मैं नहीं चाहता कि स्क्रिप्ट अतिरिक्त \ के साथ सौदा करने के लिए एक फ़ाइल से एक ही इनपुट प्राप्त किया जा सके।

बैश संस्करण: जीएनयू बैश, संस्करण 4.2.24 (1) -release (i686-पीसी-linux-gnu)

अजगर संस्करण: 2.7.3

उत्तर

7

बैश नियमित एकल और डबल-उद्धृत तारों में भागने वाले पात्रों की व्याख्या नहीं करता है। यह (कुछ) बच पात्रों की व्याख्या करने के लिए, आप $'...' उपयोग कर सकते हैं:

Words of the form $'string' are treated specially. The word expands to 
    string, with backslash-escaped characters replaced as specified by the 
    ANSI C standard. Backslash escape sequences, if present, are decoded 
    as follows: 
      \a  alert (bell) 
      \b  backspace 
      \e  an escape character 
      \f  form feed 
      \n  new line 
      \r  carriage return 
      \t  horizontal tab 
      \v  vertical tab 
      \\  backslash 
      \'  single quote 
      \nnn the eight-bit character whose value is the octal value 
       nnn (one to three digits) 
      \xHH the eight-bit character whose value is the hexadecimal 
       value HH (one or two hex digits) 
      \cx a control-x character 

    The expanded result is single-quoted, as if the dollar sign had not 
    been present. 

अर्थात

$ python parse_input.py $'1\n2\n' 
+3

(+1) अच्छा, '$ '...'' के बारे में नहीं पता था। – NPE

+0

हां, बैश के बारे में जानने के लिए हमेशा और अधिक। और zsh में और भी अधिक। – Kevin

+0

धन्यवाद! '$ '...' 'चाल चल रही थी। – Pramod

8

बैश नहीं है \n की व्याख्या करें जिस तरह से पाइथन करता है, यह दो वर्णों के रूप में देखता है।

आप एक शाब्दिक \n 'डिकोडिंग' से अजगर में एक नई पंक्ति string_escape से के रूप में (ताकि दो अक्षर) की व्याख्या कर सकते हैं:

data = data.decode('string_escape') 

प्रदर्शन:

>>> literal_backslash_n = '\\n' 
>>> len(literal_backslash_n) 
2 
>>> literal_backslash_n.decode('string_escape') 
'\n' 
>>> len(literal_backslash_n.decode('string_escape')) 
1 

ध्यान दें कि अन्य python string escape sequencesभी व्याख्या की जाएगी।

+0

'Decode' जो डेटा प्रकार की एक विशेषता है? यह मेरे दुभाषिया – asheeshr

+0

@AshRj में तारों पर काम नहीं करता है: पायथन 2, 'str' (एक बाइट स्ट्रिंग) में। –

+0

यह स्ट्रिंग पर पायथन 2 में काम करता है, लेकिन पायथन 3 में नहीं। – asheeshr