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

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

sudo sed -i 's/auth-user-pass/auth-user-pass \/etc\/openvpn\/credentials/g' /etc/openvpn/US-East.ovpn

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

我的 Python 脚本如下所示;

import subprocess

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

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

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

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

我很迷茫;谁能帮忙?

【问题讨论】:

    标签: python linux sed


    【解决方案1】:

    因为你的命令行是:

    sudo sed -i 's/auth-user-pass/auth-user-pass \/etc\/openvpn\/credentials/g' /etc/openvpn/US-East.ovpn
    

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

    subprocess.Popen(["sudo", "sed", "-i", "s/auth-user-pass/auth-user-pass \/etc\/openvpn\/credentials/g", "/etc/openvpn/US-East.ovpn"], 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\/openvpn\/credentials/g'", "/etc/openvpn/US-East.ovpn"], 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 命令参数中的逗号。谢谢
    最近更新 更多