Запуск поиска и замены с помощью sed через подпроцесс python приводит к появлению невидимых символов - PullRequest
0 голосов
/ 14 апреля 2019

При наличии файла /tmp/hi с содержимым: bali=${hi

и выполнении команды для него sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi

получается следующее содержимое в bali=${bi, как и ожидалось.

Однако выполнение команды sed внутри подпроцесса python3.5:

import subprocess
subprocess.run("sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi", shell=True)

приводит к следующему содержимому: enter image description here

проверено файл вvi и показывает: bali=$^Abi

Почему это происходит и как достичь того же содержимого файла с помощью подпроцесса python3.5?

1 Ответ

3 голосов
/ 14 апреля 2019

Это потому, что \1 интерпретируется Python. Вам нужно использовать синтаксис необработанных строк (r"some \1 string with escape sequences"), если вы хотите использовать escape-последовательности без необходимости экранировать их:

Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi")
sed -i -E 's/(^|[^.])hi/bi/g' /tmp/hi
>>> print(r"sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi")
sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi
...