python - 通过 python 子进程运行搜索并用 sed 替换会导致无法查看的字符
问题描述
给定包含内容的文件/tmp/hi
:bali=${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子进程实现相同的文件内容?
解决方案
那是因为\1
Python 正在解释 。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
推荐阅读
- c# - 尝试使用 20 GB 的 .pst 文件登录 RDOPstStore
- java - 多平台分布式日志聚合工具
- c# - 使用多个带有 into 的 LINQ 语句,因为左外连接的 DefaultIfEmpty() 不起作用
- android - UnsatisfiedLinkError:缺少 libmodpdfium.so
- c++ - 优先 gRPC 调用以避免服务器过载
- c# - 在 C# 中使用用户的密钥通过 sha1 算法进行散列
- php - 准备好的语句中的 bind_param() 错误报告
- c++ - 我的 lambda 在复制构造期间没有正确转换捕获的“this”
- angular - 重构混乱的订阅以便进一步订阅
- java - 在java中使用流api的复杂操作