首页 > 解决方案 > 通过 python 子进程运行搜索并用 sed 替换会导致无法查看的字符

问题描述

给定包含内容的文件/tmp/hibali=${hi

并在其上运行命令sed -i -E 's/(^|[^.])hi/\1bi/g' /tmp/hi

bali=${bi按预期产生以下内容。

但是,在 python3.5 子进程中运行 sed 命令:

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

结果如下: 在此处输入图像描述

检查了文件vi,它显示:bali=$^Abi

为什么会发生以及如何使用python3.5子进程实现相同的文件内容?

标签: pythonpython-3.xsedsubprocesspython-3.5

解决方案


那是因为\1Python 正在解释 。r"some \1 string with escape sequences"如果您想使用转义序列而不必转义它们,则需要使用原始字符串语法 ( ):

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

推荐阅读