Замена текста на \n в нем реальным выводом \n

Я пытаюсь получить конфигурацию от маршрутизатора Juniper, и у меня есть следующая проблема:

После настройки этого

stdin, stdout, stderr = client1.exec_command('show configuration interfaces %s' % SID)
 CONFIG = stdout.read()
 print CONFIG

Это приносит мне что-то вроде этого

'description El_otro_Puerto_de_la_Routing-instance;\nvlan-id 309;\nfamily inet {\n    mtu 1600;\n    address 10.100.10.10/24;\n}\n'

и проблема в том, что я хочу получить эту информацию в этом формате:

'description El_otro_Puerto_de_la_Routing-instance;
 nvlan-id 309;
 nfamily inet {
  mtu 1600;
  address 10.100.10.10/24;
 }

Поэтому я хочу, чтобы \ n была новой строкой, а не просто показывала мне строку "\n".

5 ответов

Решение

Если вы выполняете это в интерпретаторе Python, то обычное поведение интерпретатора - показывать новые строки в виде "\n" вместо реальных новых строк, потому что это облегчает отладку вывода. Если вы хотите получить настоящие переводы строк в переводчике, вам следует print Строка, которую вы получите.

Если это то, что выводит программа (т.е. вы получаете escape-последовательности новой строки из внешней программы), вы должны использовать следующее:

OUTPUT = stdout.read()
formatted_output = OUTPUT.replace('\\n', '\n')
print formatted_output

Это заменит экранированные символы новой строки фактическими символами новой строки в выходной строке.

В Python 3+ лучший способ интерпретировать все escape-символы:

      print(f"{yourStringHere}")

Здесь используются f-строки, что, на мой взгляд, вероятно, является наиболее элегантным способом решения этой проблемы.

Это тоже работает:

CONFIG = """{}""".format(CONFIG)

Регулярное выражение может помочь в поиске \xпоследовательности. Однако пары замещения все равно придется указывать вручную, как и в ответе @PedroCastilho .

      import re
CONFIG = stdout.read()
print(re.sub(r'\\.',lambda x:{'\\n':'\n','\\t':'\t'}.get(x[0],x[0]),CONFIG))

Это заменит \\n-песок \\t-s с фактическими разрывами строк и табуляторами и оставляет неизвестные нетронутыми.

Нравиться

      print(re.sub(r'\\.',lambda x:{'\\n':'\n','\\t':'\t'}.get(x[0],x[0]),
      'foo\\nbar\\nbaz\\tbrr\\n\\q'))

отпечатки

       foo
bar
baz     brr
\q

Итак, разрывы строк и табулятор на месте, и \qпросто выжил.

Альтернативой тому, что вы хотите, является разбиение вашей строки на список строк (для каждой строки).

>>> mystr = 'a\nb\nc'
>>> mystr = mystr.split(sep='\n')
>>> print(mystr)
['a', 'b', 'c']
>>> for s in mystr:
    print(s)
a
b
c
Другие вопросы по тегам