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命令问题[重复]