【问题标题】:Escaping in Python subprocess for sed command在 Python 子进程中为 sed 命令转义
【发布时间】:2015-07-14 00:05:10
【问题描述】:

我正在使用 Python 在子进程的帮助下进行 sed 删除/替换。不知何故,我没有得到正确的转义次数。这是我的代码:

from subprocess import call

remover = ["sed", "-i", "'1d'", "file"]
call(remover)

removeq = ["sed", "-i", "'s/\"//g'", "file"]
call(removeq)

这两个任务都会产生错误消息:

sed: -e expression #1, char 1: unknown command: `''

第一个列表中的 ' 符号需要转义多少次,最后一个列表中的 " 符号必须转义多少次?我尝试了一次、两次和三次,但都无济于事。有也没有可能会搞砸的隐藏字符。

有什么建议吗?

【问题讨论】:

  • 单引号不正确。它们在 shell 上运行命令来引用单词时使用,但当直接执行时(不涉及 shell),它们被视为文字字符并混淆 sed(可以看出)。
  • "我正在使用 Python 进行 sed 删除 / 替换为 ..." 为什么?只需在 Python 中本地执行...
  • 据我了解,如果您希望在不创建新文件的情况下就地完成,使用 sed 更简单?
  • 可能,如果您将“简单”定义为“实际代码行数最少,但效率较低,因为它会产生额外的进程,以及相关的 fork()、exec()、潜在的磁盘访问和其他开销...”

标签: python unix sed subprocess


【解决方案1】:

修复引用机制:

sed -i 's/\"//g' file

应该只是:

sed -i 's/"//g' file

您还可以使用shlex 库。 来自解释器的示例:

>>> import  shlex
>>> cmd = "sed -i '1d' file"
>>> shlex.split(cmd)
['sed', '-i', '1d', 'file']
>>> cmd = """sed -i 's/"//g' file"""
>>> shlex.split(cmd)
['sed', '-i', 's/"//g', 'file']

【讨论】:

猜你喜欢
  • 2013-04-27
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2021-07-25
  • 2017-09-06
  • 2015-10-29
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多