在python os.system中使用linux sed命令[重复]

Posted

技术标签:

【中文标题】在python os.system中使用linux sed命令[重复]【英文标题】:Using linux sed command in python os.system [duplicate] 【发布时间】:2021-03-02 16:04:53 【问题描述】:

我在使用带有 os.system() 的 sed 命令时遇到问题

path= "/backup/verify/2020-11-19_test_pg_basebackup_daily_verify/postgresql.conf"
sed = "sed -i.bak 's/^\(port = \).*/\15437/' "+path
print(sed)
os.system(''.format(sed))

我打印sed 看看出了什么问题,这就是我得到的:

sed -i.bak 's/^\(port = \).*/l37/' /backup/verify/2020-11-19_test_pg_basebackup_daily_verify/postgresql.conf

为什么5437 发生了变化?同样,当我尝试在 os.system 中编写整个命令而不使用字符串 sed 时,我会收到以下错误:


-bash-4.2$ ./func.py verify 2020-11-19_test_pg_basebackup_daily
  File "./func.py", line 56
    os.system('sed -i.bak 's/^\(port = \).*/\15437/' /backup/verify/2020-11-19_test_pg_basebackup_daily_verify/postgresql.conf')
                           ^
SyntaxError: invalid syntax

【问题讨论】:

这能回答你的问题吗? Why do numbers in a string become "x0n" when a backslash precedes them? 引号中有引号。你能指望什么?使用 python 功能和正则表达式,而不是运行外部(非便携式)命令。 【参考方案1】:

Python(与许多其他编程语言一样)使用反斜杠 \ 作为字符串中的特殊字符,以生成其他难以处理的字符。一个众所周知的例子是'\n' 用于换行。事实证明,\1 也被解释为特殊的东西。要告诉 Python 将您的字符串 literally 理解为您输入的内容,请使用 r 前缀:

sed = r"sed -i.bak 's/^\(port = \).*/\15437/' "+path

这里r 代表“raw”或“regex(r正则表达式)”,后者是常见用例。

【讨论】:

这里的 r 代表“raw”或“regex(正则表达式)”:不,它只是“raw”。

以上是关于在python os.system中使用linux sed命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章

(Python/Linux) 通过 python 或 os.system 命令播放无延迟的 wav 文件

将 SED 命令转换为 linux 命令

Python:运行 os.system 后如何获取标准输出? [复制]

Python 基础之模块之os os.path 及os与shutil对比

Python中执行系统命令常见的几种方法

在python中执行linux time命令