Sed 从命令行工作,但不在 Python 脚本中

Posted

技术标签:

【中文标题】Sed 从命令行工作,但不在 Python 脚本中【英文标题】:Sed working from the command line but not within a Python script 【发布时间】:2021-05-02 22:31:24 【问题描述】:

我正在尝试在 Python 脚本中运行以下命令:

sudo sed -i 's/auth-user-pass/auth-user-pass \/etc\/open***\/credentials/g' /etc/open***/US-East.o***

上面的命令在终端中运行良好。

我的 Python 脚本如下所示;

import subprocess

subprocess.Popen(["sudo", "sed", "-i", "'s/auth-user-pass/auth-user-pass", "\/etc\/open***\/credentials/g'", "/etc/open***/US-East.o***"], stdout=subprocess.PIPE, text=True) 

但是当我运行脚本时出现以下错误

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

我认为某些字符(如单引号)可能需要转义,但我一直在尝试,但它们都不起作用。

我很迷茫;谁能帮忙?

【问题讨论】:

【参考方案1】:

因为你的命令行是:

sudo sed -i 's/auth-user-pass/auth-user-pass \/etc\/open***\/credentials/g' /etc/open***/US-East.o***

您需要删除单引号(shell 会为您执行此操作)并且您需要将整个单引号参数保留为一个参数,而不是将其拆分为空格(shell 不会拆分为内部的空格)带引号的字符串):

subprocess.Popen(["sudo", "sed", "-i", "s/auth-user-pass/auth-user-pass \/etc\/open***\/credentials/g", "/etc/open***/US-East.o***"], stdout=subprocess.PIPE, text=True)

sed 命令不希望看到单引号。

【讨论】:

嘿@Jonathan 感谢您帮助我。我现在收到错误 sed: -e expression #1, char 31: unterminated s' command` 我不确定 S 命令是什么。 Sed 文档非常简陋 好吧,我想通了,答案是这个答案和下面的答案 - 所以删除单引号并删除 sed 命令参数中的逗号。谢谢【参考方案2】:

你能在 sed 命令参数中不带逗号的情况下测试吗?

import subprocess

subprocess.Popen(["sudo", "sed", "-i", "'s/auth-user-pass/auth-user-pass \/etc\/open***\/credentials/g'", "/etc/open***/US-East.o***"], stdout=subprocess.PIPE, text=True)

【讨论】:

欢迎来到 Stack Overflow!请不要通过破坏您的帖子来为其他人做更多的工作。通过在 Stack Exchange 网络上发布,您已授予不可撤销的权利,在 CC BY-SA license (2.5/3.0/4.0) 下,Stack Exchange 可以分发该内容(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? 嘿@cigien 好的,所以我想通了,答案就是这个答案和上面的答案 - 所以删除单引号并删除 sed 命令参数中的逗号。谢谢

以上是关于Sed 从命令行工作,但不在 Python 脚本中的主要内容,如果未能解决你的问题,请参考以下文章

用于包装嘈杂的python脚本并使用sed删除特定行的shell命令问题[重复]

函数内部 sed 命令中的 bash 语法错误,在命令行上工作正常

shell脚本sed命令行编辑器

shell脚本sed命令行编辑器

shell脚本sed命令行编辑器

zcat 在命令行中工作,但不在 perl 脚本中