2013-02-16 10 views
5

sto chiamando uno script python, parse_input.py da bashdi analisi in argomento della linea di comando - python 2.7.3

parse_input.py prende un argomento riga di comando che ha molti '\n' caratteri in esso. Ingresso

Esempio:

$ 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 

posso vedere sul PPB che `data = "1\\n2\\n" mentre io voglio data="1\n2\n"

ho visto un comportamento simile con appena \ (senza \n) che viene sostituito da \\

Come rimuovere l'extra \?

Non voglio che lo script abbia a che fare con lo \ in più come lo stesso input può anche essere ricevuto da un file.

bash versione: GNU bash, la versione 4.2.24 (1) -release (i686-pc-linux-gnu)

versione di Python: 2.7.3

risposta

7

Bash non interpreta i caratteri di escape nelle normali stringhe singole e doppie. Per farlo interpretare (alcuni) caratteri di escape, è possibile utilizzare $'...':

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. 

cioè

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

(+1) Bello, non sapeva di '$ '...''. – NPE

+0

Sì, sempre di più da sapere su bash. E ancora di più in zsh. – Kevin

+0

Grazie! '$ '...'' ha fatto il trucco. – Pramod

8

Bash non lo fa interpretare \n come fa Python, lo vede come due caratteri.

È può interpretare un letterale \n (quindi due personaggi) come un ritorno a capo in python da 'decodifica' dal string_escape:

data = data.decode('string_escape') 

Dimostrazione:

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

notano che altro python string escape sequences sarà anche essere interpretato.

+0

'Decode' è un attributo di quale tipo di dati? Non funziona sulle stringhe nel mio interprete – asheeshr

+0

@AshRj: In python 2, 'str' (una stringa di byte). –

+0

Funziona in Python 2 su stringhe, ma non in Python 3. – asheeshr

Problemi correlati